1 10 1 2 3 4 5 6 7 8 9 10 7 Q 1 5 A 1 5 Q 1 5 D 10 11 Q 10 10 D 10 9 Q 10 10
15 5 20 6 10 10 1 1
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> using namespace std; #define maxn 50010 int MAX,SUM; struct node { int l,r,ma,sum; }t[maxn*4]; int n,m; int a[maxn]; void make(int l,int r,int id) { t[id].l=l; t[id].r=r; if(l==r) { t[id].ma=t[id].sum=a[l]; } else if(t[id].r>t[id].l) { int mid=(t[id].l+t[id].r)/2; make(l,mid,id*2); make(mid+1,r,id*2+1); t[id].sum=t[id*2].sum+t[id*2+1].sum; t[id].ma=max(t[id*2].ma,t[id*2+1].ma); } } void add(int x,int y,int id) { if(x==t[id].l&&x==t[id].r) { if(y<=0&&abs(y)>t[id].sum)return; t[id].ma+=y; t[id].sum+=y; return ; } else if(t[id].r>t[id].l) { int mid=(t[id].r+t[id].l)/2; if(x>mid) add(x,y,id*2+1); else add(x,y,id*2); t[id].sum=t[id*2].sum+t[id*2+1].sum; t[id].ma=max(t[id*2+1].ma,t[id*2].ma); } } void query(int x,int y,int id) { if(x<=t[id].l&&y>=t[id].r) { SUM+=t[id].sum; MAX=max(t[id].ma,MAX); return; } else if(t[id].r>t[id].l) { int mid=(t[id].r+t[id].l)/2; if(y<=mid) query(x,y,id*2); else if(x>=mid+1) query(x,y,id*2+1); else { query(x,mid,id*2); query(mid+1,y,id*2+1); t[id].sum=t[id*2].sum+t[id*2+1].sum; t[id].ma=max(t[id*2+1].ma,t[id*2].ma); } } } int main() { int t; char str[3]; int x,y; int i; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); make(1,n,1); scanf("%d",&m); while(m--) { scanf("%s",&str); if(str[0]=='Q') { MAX=0,SUM=0; scanf("%d%d",&x,&y); query(x,y,1); printf("%d %d\n",SUM,MAX); } else if(str[0]=='A') { scanf("%d%d",&x,&y); add(x,y,1); } else if(str[0]=='D') { scanf("%d%d",&x,&y); add(x,-y,1); } } } return 0; }