0分求助(线段树)
  • 板块P1531 I Hate It
  • 楼主KingPowers
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/1/24 10:36
  • 上次更新2023/10/28 11:21:16
查看原帖
0分求助(线段树)
530180
KingPowers楼主2022/1/24 10:36

样例和自造数据全都对,十分惊愕

#include<bits/stdc++.h>
#define int long long
using namespace std;
char c;
int t[200050],v[800050],n,m,a,b;
void update(int k)
{
	v[k]=max(v[k<<1],v[k<<1|1]);
}
void build(int l,int r,int k)
{
	if(l==r)
	{
		v[k]=t[l];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,k<<1);
	build(mid+1,r,k<<1|1);
	update(k);
}
void change_point(int s,int q,int l,int r,int k)
{
	if(l==r)
	{
		v[k]+=q;
		return;
	}
	int mid=(l+r)>>1;
	if(s<=mid)
		change_point(s,q,l,mid,k<<1);
	else
		change_point(s,q,mid+1,r,k<<1|1);
	update(k);
}
int get_out(int l,int r,int now_l,int now_r,int k)
{
	int a=0,b=0;
	if(l<=now_l&&r>=now_r)
		return v[k];
	int mid=(now_l+now_r)>>1;
	if(l<=mid)
		a=get_out(l,r,now_l,mid,k<<1);
	if(r>mid)
		b=get_out(l,r,mid+1,now_r,k<<1|1);
	return max(a,b);
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>t[i];
	build(1,n,1);
	while(m--)
	{
		cin>>c>>a>>b;
		if(c=='Q')
			cout<<get_out(a,b,1,n,1)<<endl;
		else
			if(get_out(a,a,1,n,1)<b)
				change_point(a,b-a,1,n,1);
	}
}
2022/1/24 10:36
加载中...