hdu 1166

来源:互联网 发布:屏幕闪电软件 编辑:程序博客网 时间:2024/05/22 06:11
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <vector>#include <map>#include <set>#include <string>#include <cstring>#include <list>#include <queue>#include <stack>#include <cmath>using namespace std;#define PF(x) (scanf("%d",&x))#define PT(x,y) (scanf("%d%d",&x,&y))#define PR(x) (printf("%d\n",x))#define PRT(x,y)(printf("%d %d\n",x,y))#define PB(x)(scanf("%I64d",&x))#define PRB(x)(printf("%I64d\n",(x)))typedef __int64 LL;#define N 50005#define M 105#define Mod 1000#define Inf 0x7fffffff#define L(x) (x<<1)#define R(x) ((x<<1)|1)#define For(i,n) for(int i=0;i<n;i++)#define lowbit(x) (x) & (-x)#define mid(x,y) ((x+y)>>1)struct tree{int l,r;LL sum;};tree T[4*N];int n;void build(int l,int r,int k){    T[k].l = l;T[k].r = r;T[k].sum = 0;if(l == r) return ;    int mi = mid(l,r);build(l,mi,L(k));build(mi+1,r,R(k));}void update(int v,int var,int k){if(T[k].l == T[k].r ){T[k].sum += (LL)v;return ;}int mi = mid(T[k].l,T[k].r);if(var<=mi) update(v,var,L(k));else update(v,var,R(k));T[k].sum += (LL)v;}LL sum(int l,int r,int k){if(T[k].l == l && T[k].r == r)return T[k].sum;int mi = mid(T[k].l,T[k].r);if(r<=mi) return sum(l,r,L(k));else if(l>mi) return sum(l,r,R(k));return sum(l,mi,L(k))+sum(mi+1,r,R(k));}void init(){int test;PF(test);For(i,test){printf("Case %d:\n",i+1);PF(n);build(1,N,1);For(j,n){int x;PF(x);update(x,j+1,1);}char s[100];int x,y;while(1){scanf("%s%",s);if(s[0] == 'E') break;else if(s[0] == 'A'){PT(x,y);update(y,x,1);}else if(s[0] == 'S'){PT(x,y);update(-y,x,1);}else{PT(x,y);PRB(sum(x,y,1));}}}return ;}int main(){init();return 0;}