线段树30分求调
查看原帖
线段树30分求调
582167
Avengers__lsw楼主2022/7/4 17:09
#include<iostream>
using namespace std;
const int N=2e5+10;
int n,m,w[N];
struct node{
	int l;
	int r;
	int maxx;
}tr[N*4];
void pushup(int u)
{
    tr[u].maxx=max(tr[u<<1].maxx,tr[u<<1|1].maxx);	
} 
void build(int u,int l,int r)
{
	 if(l==r)tr[u]={l,r,w[r]};
	 else
	 {
	 	tr[u]={l,r};
	 	int mid=l+r>>1;
	 	build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u); 
	 }
}
int query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r)return tr[u].maxx;
	else
	{
		int ans=-0x7fffffff;
		int mid=tr[u].l+tr[u].r>>1;
		if(l<=mid)ans=max(ans,query(u<<1,l,r));
		if(r>mid)ans=max(ans,query(u<<1|1,l,r));
		return ans;
	}
}
void modify(int u,int x,int v)
{
    if(tr[u].l==tr[u].r)
    {
    	tr[u].maxx+=v;
	}
    else
    {
    	int mid=tr[u].l+tr[u].r>>1;
    	if(x<=mid)modify(u<<1,x,v);
    	else modify(u<<1|1,x,v);
    	pushup(u);
	}
} 
int main()
{
	char op;
	int a,b;
	cin>>n>>m;
	for(int i=1;i<=n;i++)scanf("%d",&w[i]);
	build(1,1,n);
	while(m--)
	{
		cin>>op;
		if(op=='Q')
		{
			cin>>a>>b;
			cout<<query(1,a,b)<<endl;
		}
		else
		{
			cin>>a>>b;
			if(b-w[a]>0)
			{ 
			int ans=b-w[a];
			modify(1,a,ans);
		    }
		    else continue;
		}
	}
	return 0;
}

不知道哪里错了

2022/7/4 17:09
加载中...