i hate it(单点修改,区间查询)

    xiaoxiao2022-07-07  185

    #include<bits/stdc++.h> using namespace std; #define maxn 4000005 int root[maxn]; void pushup(int x) { root[x]=max(root[x<<1],root[x<<1|1]); } void build(int x,int l,int r){ if (l==r) { scanf("%d",&root[x]);return;} int m=(l+r)>>1; build(x<<1,l,m); build(x<<1|1,m+1,r); pushup(x); } void update(int p,int q,int x,int l,int r) { if (l==r) { root[x]=q;//printf("root[p]=%d",root[p]); return; } int m=(l+r)>>1; if (p<=m) update(p,q,x<<1,l,m); else update(p,q,x<<1|1,m+1,r); pushup(x); } int getmax(int L,int R,int x,int l,int r){ if (L<=l&&r<=R) { //printf("[]=%d\n",root[x]); return root[x]; } int m=(l+r)>>1; int ans=0; if (L<=m) ans=max(ans,getmax(L,R,x<<1,l,m)); if (R>m) ans=max(ans,getmax(L,R,(x<<1)|1,m+1,r)); // printf("ans=%d\n",ans); return ans; } int main(){ int n,m,a,b,i; char c[10]; while (~scanf("%d%d",&n,&m)) { build(1,1,n); int x,y; for (int i=1;i<=m;i++) { scanf("%s%d%d",&c,&x,&y); if (c[0]=='Q') printf("%d\n",getmax(x,y,1,1,n)); else update(x,y,1,1,n); } } return 0; }
    最新回复(0)