1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 #define MAXN 10010
 5 int tree[MAXN<<2],ca=1;
 6 inline void PushUp(int rt)
 7 {
 8     tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);
 9 }
10 void Build(int L,int R,int rt)
11 {
12     if(L==R)
13         scanf("%d",&tree[rt]);
14     else
15     {
16         int mid=(L+R)>>1;
17         Build(L,mid,rt<<1);
18         Build(mid+1,R,rt<<1|1);
19         PushUp(rt);
20     }
21 }
22 void Add(int x,int val,int L,int R,int rt)
23 {
24     if(L==R)
25         tree[rt]+=val;
26     else
27     {
28         int mid=(L+R)>>1;
29         if(x<=mid)
30             Add(x,val,L,mid,rt<<1);
31         else
32             Add(x,val,mid+1,R,rt<<1|1);
33         PushUp(rt);
34     }
35 }
36 void Update(int val,int L,int R,int rt)
37 {
38     if(L==R)
39         tree[rt]+=val;
40     else
41     {
42         int mid=(L+R)>>1;
43         if(tree[rt]==tree[rt<<1])
44             Update(val,L,mid,rt<<1);
45         else
46             Update(val,mid+1,R,rt<<1|1);
47         PushUp(rt);
48     }
49 }
50 void Query(int L,int R,int rt)
51 {
52     if(L==R)
53         printf("Case %d: %d %d\n",ca++,L,tree[rt]);
54     else
55     {
56         int mid=(L+R)>>1;
57         if(tree[rt]==tree[rt<<1])
58             Query(L,mid,rt<<1);
59         else
60             Query(mid+1,R,rt<<1|1);
61     }
62 }
63 int main()
64 {
65     int n,t,q,a,b;
66     scanf("%d",&t);
67     while(t--)
68     {
69         scanf("%d",&n);
70         Build(1,n,1);
71         scanf("%d",&q);
72         while(q--)
73         {
74             scanf("%d%d",&a,&b);
75             if(a)
76                 Add(a,b,1,n,1);
77             else
78                 Update(b,1,n,1);
79         }
80         Query(1,n,1);
81     }
82     return 0;
83 }
posted on 2012-06-21 11:02  DrunBee  阅读(334)  评论(1编辑  收藏  举报