入门线段树题
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define Lson l,m,rt<<1 #define Rson m+1,r,rt<<1|1 int const MAXN = 200010; int n,m; struct Tree{ int l,r; int v; }tree[MAXN * 4]; inline int Max(int a,int b){ return a>b?a:b; } inline void PushUp(int rt){ tree[rt].v = Max(tree[rt<<1].v,tree[rt<<1|1].v); } void Build(int l,int r,int rt){ tree[rt].l = l; tree[rt].r = r; if(l == r){ scanf("%d",&tree[rt].v); return ; } int m = (l + r)>>1; Build(Lson); Build(Rson); PushUp(rt); } void Update(int p,int s,int l,int r,int rt){ if(l == r){ tree[rt].v = s; return ; } int m = (l + r)>>1; if(p <= m) Update(p,s,Lson); else Update(p,s,Rson); PushUp(rt); } int Query(int L,int R,int l,int r,int rt){ if(L <= l && r <= R){ return tree[rt].v; } 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(){ while(~scanf("%d%d",&n,&m)){ Build(1,n,1); for(int i = 0;i < m;i++){ char str[3]; int a,b; scanf("%s%d%d",str,&a,&b); if(str[0] == 'Q') printf("%d\n",Query(a,b,1,n,1)); else Update(a,b,1,n,1); } /*for(int i = 1;i <= n * 2;i++){ cout<<tree[i].v<<endl; }*/ } return 0; }