Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define mx 300005
- using namespace std;
- struct info {
- int prop, sum;
- } tree[mx * 4];
- int arr[mx];
- void init(int node, int b, int e)
- {
- if (b == e) {
- tree[node].sum = arr[b];
- tree[node].prop=0;
- 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].sum = tree[Left].sum + tree[Right].sum;
- }
- void update(int node, int b, int e, int i, int j, int x)
- {
- if (i > e || j < b)
- return;
- if (b >= i && e <= j)
- {
- tree[node].sum += ((e - b + 1) * x);
- tree[node].prop += x;
- return;
- }
- int Left = node * 2;
- int Right = (node * 2) + 1;
- int mid = (b + e) / 2;
- update(Left, b, mid, i, j, x);
- update(Right, mid + 1, e, i, j, x);
- tree[node].sum = tree[Left].sum + tree[Right].sum + (e - b + 1) * tree[node].prop;
- }
- int query(int node, int b, int e, int i, int j, int carry = 0)
- {
- if (i > e || j < b)
- return 0;
- if (b >= i and e <= j)
- return tree[node].sum + carry * (e - b + 1);
- int Left = node << 1;
- int Right = (node << 1) + 1;
- int mid = (b + e) >> 1;
- int p1 = query(Left, b, mid, i, j, carry + tree[node].prop);
- int p2 = query(Right, mid + 1, e, i, j, carry + tree[node].prop);
- return p1 + p2;
- }
- int main()
- {
- freopen("input.txt","r",stdin);
- int n,t,cs=1,q;
- int x,y;
- int type;
- scanf("%d%d",&n,&q);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&arr[i]);
- }
- init(1,1,n);
- while(q--)
- {
- scanf("%d",&type);
- if(type==1)
- {
- scanf("%d%d",&x,&y);
- update(1,1,n,x,y,5); //here 5 is the inc value
- }
- else
- {
- scanf("%d%d",&x,&y);
- int z=query(1,1,n,x,y);
- printf("%d\n",z);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement