线段树单点更新
#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1 //左儿子
#define rson m+1,r,rt<<1|1 //右儿子
const int maxn=200020;
int maxs[maxn<<2];
void PushUP(int rt) //把当前结点的信息更新到父结点
{
maxs[rt]=max(maxs[rt<<1],maxs[rt<<1|1]);
}
void build(int l,int r,int rt) //建树
{
if(l==r)
{
scanf("%d",&maxs[rt]);
return ;
}
int m=(l+r)>>1;
build(lson);
build(rson);
PushUP(rt);
}
void update(int p,int sc,int l,int r,int rt) //单点替换
{
if(l==r)
{
maxs[rt]=sc;
return ;
}
int m=(l+r)>>1;
if(p<=m)
update(p,sc,lson);
else
update(p,sc,rson);
PushUP(rt);
}
int query(int L,int R,int l,int r,int rt) //区间最值
{
if(L<=l&&r<=R)
return maxs[rt];
int m=(l+r)>>1;
int ret=0;
if(L<=m)
ret=max(ret,query(L,R,lson));
if(R>m)
ret=max(ret,query(L,R,rson));
return ret;
}
int main()
{
int N,M,a,b;
char c[2];
while(scanf("%d%d",&N,&M)==2)
{
build(1,N,1);
for(int i=1;i<=M;i++)
{
scanf("%s%d%d",c,&a,&b);
if(c[0]=='Q')
printf("%d\n",query(a,b,1,N,1));
else
update(a,b,1,N,1);
}
}
return 0;
}
另一种
#include<bits/stdc++.h>
using namespace std;
int a[200020<<2];
struct node
{
int l,r,mid,Max;
}s[200020<<2];
void build(int id,int l,int r)
{
s[id].l=l,s[id].r=r;
s[id].mid=(l+r)>>1;
if(l==r)
s[id].Max=a[l];
else
{
build(id<<1,l,s[id].mid);
build(id<<1|1,s[id].mid+1,r);
s[id].Max=max(s[id<<1|1].Max,s[id<<1].Max);
}
}
void update(int id,int p,int add)
{
if(s[id].l==s[id].r)
s[id].Max=add;
else
{
if(p<=s[id].mid)
update(id<<1,p,add);
else if(p>s[id].mid)
update(id<<1|1,p,add);
s[id].Max=max(s[id<<1|1].Max,s[id<<1].Max);
}
}
int query(int id,int l,int r)
{
if(l<=s[id].l&&r>=s[id].r)
return s[id].Max;
else if(l>s[id].mid)
return query(id<<1|1,l,r);
else if(r<=s[id].mid)
return query(id<<1,l,r);
else
return max(query(id<<1|1,l,r),query(id<<1,l,r));
}
int main()
{
int N,M,A,B;
char C[20];
while(scanf("%d%d",&N,&M)==2)
{
for(int i=1;i<=N;i++)
scanf("%d",&a[i]);
build(1,1,N);
for(int i=1;i<=M;i++)
{
scanf("%s %d %d",C,&A,&B);
if(C[0]=='Q')
printf("%d\n",query(1,A,B));
else
update(1,A,B);
}
}
return 0;
}