#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define SMAX 10000+5 int T[SMAX<<2];//树 int S[SMAX];//原 int V[SMAX<<2]; void build(int l,int r,int t)//建树 { if(l==r) { T[t]=S[l]; return ; } int m=(l+r)>>1; build(l,m,t<<1); build(m+1,r,t<<1|1); T[t]=T[t<<1]+T[t<<1|1]; return ; } void push_up(int t)//维护 { T[t]==T[t<<1]+T[t<<1|1]; return ; } //查询 int query(int L,int R,int l,int r,int t) { if(L<=l&&R>=r) return T[t]; int m=(l+r)>>1,res=0; if(L<=m) res+=query(L,R,l,m,t<<1); if(R>m) res+=query(L,R,m+1,r,t<<1|1); return res; } //单点更新 //p为更新的值,n为增加的值 void update(int p,int n,int l,int r,int t) { if(l==r) { T[t]+=n; return ; } int m=(l+r)>>1; if(m>=p) update(p,n,l,m,t<<1); else update(p,n,m+1,r,t<<1|1); T[t]=T[t<<1]+T[t<<1|1]; return ; } void push_down(int t, int s) { if (V[t]) { V[t << 1] += V[t]; V[t << 1|1] += V[t]; T[t << 1] += V[t ]*(s - (s >> 1)); T[t << 1|1] += V[t]*(s >> 1); V[t] = 0; } return ; } /*区间更新*/ void update1(int L, int R, int n, int l, int r, int t) { if (L <= l && R >= r) { T[t] += n*(r - l + 1); V[t] += n; return ; } int m = (l + r) >> 1; //push_down(t, r - l + 1); int s=r-l+1; push_down(t,s); if (L <= m) update1(L,R, n, l, m, t << 1); if (R > m) update1(L,R, n, m + 1, r, t << 1|1); T[t]=T[t<<1]+T[t<<1|1]; return ; } int main() { int i,o; for(i=1; i<=5; i++) { cin>>S[i]; } build(1,5,1); for(i=1; i<=10; i++) { cout< #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define maxn 300005 int t1[maxn]; int t2[maxn<<2]; void build(int l,int r,int t) { if(l==r) { t2[t]=t1[l]; return ; } int mid=(l+r)>>1; build(l,mid,t<<1); build(mid+1,r,t<<1|1); t2[t]=max(t2[t<<1],t2[t<<1|1]); return ; } void update(int p,int n,int l,int r,int t) { if(l==r) { t2[t]=n; return ; } int mid=(l+r)>>1; if(p<=mid) update(p,n,l,mid,t<<1); else update(p,n,mid+1,r,t<<1|1); t2[t]=max(t2[t<<1],t2[t<<1|1]); //return ; } int com_max(int L,int R,int l,int r,int t) { if(L<=l&&R>=r) { return t2[t]; } int ans=-9999999; int mid=(l+r)>>1; if(L<=mid) ans=max(ans,com_max(L,R,l,mid,t<<1)); if(R>mid) ans=max(ans,com_max(L,R,mid+1,r,t<<1|1)); return ans; } int main() { int n,m; char a; int b,c,d,e,f; int d1[maxn]; while(scanf("%d %d",&n,&m)!=EOF) { f=0; for(int i=1; i<=n; i++) { scanf("%d",&t1[i]); } build(1,n,1); while(m--) { getchar(); scanf("%c",&a); getchar(); if(a=='Q') { scanf("%d %d",&b,&c); d1[f]=com_max(b,c,1,n,1); f++; } if(a=='U') { scanf("%d %d",&d,&e); update(d,e,1,n,1); } } for(int i=0;i