Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define arr_s 100005
- int arr[arr_s];
- int tree[arr_s * 3];
- void init(int node, int b, int e)
- {
- if (b == e)
- {
- tree[node] = arr[b];
- return;
- }
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- init(Left, b, mid);
- init(Right, mid + 1, e);
- tree[node] = tree[Left] + tree[Right];
- }
- void update(int node, int b, int e, int i, int newvalue)
- {
- if (i > e || i < b)
- return;
- if (b >= i && e <= i)
- {
- tree[node] -= newvalue;
- return;
- }
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- update(Left, b, mid, i, newvalue);
- update(Right, mid + 1, e, i, newvalue);
- tree[node] = tree[Left] + tree[Right];
- }
- void update1(int node, int b, int e, int i, int newvalue)
- {
- if (i > e || i < b)
- return;
- if (b >= i && e <= i)
- {
- tree[node] += newvalue;
- return;
- }
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- update1(Left, b, mid, i, newvalue);
- update1(Right, mid + 1, e, i, newvalue);
- tree[node] = tree[Left] + tree[Right];
- }
- int query(int node, int b, int e, int i, int j)
- {
- if (i > e || j < b)
- return 0;
- if (b >= i && e <= j)
- return tree[node];
- int Left = node * 2;
- int Right = node * 2 + 1;
- int mid = (b + e) / 2;
- int p1 = query(Left, b, mid, i, j);
- int p2 = query(Right, mid + 1, e, i, j);
- return p1 + p2;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- int t;
- scanf("%d",&t);
- int cs=0;
- while(t--)
- {
- int n,q;
- scanf("%d %d",&n,&q);
- for(int i = 0; i<n; i++)
- {
- scanf("%d",&arr[i]);
- }
- init(1,0,n-1);
- printf("Case %d:\n",++cs);
- while(q--)
- {
- int i;
- scanf("%d",&i);
- if(i==1)
- {
- int v;
- scanf("%d",&v);
- //cout<<arr[v]<<endl;
- printf("%d\n",arr[v]);
- update(1, 0, n-1, v, arr[v]);
- }
- if(i==2)
- {
- int j,v;
- scanf("%d %d",&j,&v);
- update1(1, 0, n-1, j,v);
- }
- if(i==3)
- {
- int j,k;
- scanf("%d %d",&j,&k);
- int ans = query(1,0,n-1,j,k);
- printf("%d\n",ans);
- }
- }
- memset(arr,0,sizeof arr);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement