单点修改,区间查询最大值的模板
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,m;
int a[maxn],tree[maxn<<2];
void build(int now, int l,int r)
{
if(l==r)
{
tree[now]=a[l];
return;
}
int mid=(l+r)>>1;
build(now<<1,l,mid);
build(now<<1|1,mid+1,r);
tree[now]=max(tree[now<<1],tree[now<<1|1]);
}
void change(int now,int l,int r,int x,int val)
{
if(l==r)
{
tree[now]=max(tree[now],val);
return;
}
int mid=(l+r)>>1;
if(x<=mid) change(now<<1,l,mid,x,val);
else change(now<<1|1,mid+1,r,x,val);
tree[now]=max(tree[now<<1],tree[now<<1|1]);
}
int query(int now,int l,int r,int x,int y)
{
if(x<=l && r<=y) return tree[now];
int mid=(l+r)>>1,ans=-1e9;
if(x<=mid) ans=max(ans,query(now<<1,l,mid,x,y));
if(y>mid) ans=max(ans,query(now<<1|1,mid+1,r,x,y));
return ans;
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
for(int i=1;i<=m;i++)
{
char e[25]; int x,y;
scanf("%s%d%d",e,&x,&y);
if(e[0]=='Q') printf("%d\n",query(1,1,n,x,y));
else change(1,1,n,x,y);
}
return 0;
}