#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
#define siz 1000005
int a[siz],b[siz];
int n,m,sqrtN;
char as[siz];
void reset(){
for(int i=0;i<=sqrtN;i++){
b[i]=0;
}
}
void search(int x, int y){
int sum=0;
for(int i=x;i<=y;i++){
if(i+sqrtN<=y&&(i+sqrtN)%sqrtN==0){
sum+=b[i/sqrtN];
i+=(sqrtN-1);
}
else sum+=a[i];
}
printf("%d\n",sum);
}
int main()
{
int x,y,q;
//freopen("input.txt","r",stdin);
scanf("%d",&n);
for(int t=0;t<n;t++){
scanf("%d",&m);
sqrtN=(int)sqrt((double)m);
reset();
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
b[i/sqrtN]+=a[i];
}
scanf("%d",&q);
for(int i=0;i<q;i++){
scanf("%s",&as);
if(strcmp(as,"Inquire")==0){
scanf("%d%d",&x,&y);
search(x-1,y-1);
}
else if(strcmp(as,"Add")==0){
scanf("%d%d",&x,&y);
x-=1;
a[x]+=y;
b[x/sqrtN]+=y;
}
else if(strcmp(as,"Delete")==0){
scanf("%d%d",&x,&y);
x-=1;
if(a[x]<y){
b[x/sqrtN]-=a[x];
a[x]=0;
}
else{
a[x]-=y;
b[x/sqrtN]-=y;
}
}
}
}
return 0;
}
Wednesday, October 31, 2012
Range Minimum Query (RMQ)
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment