Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include<bits/stdc++.h>
- #include<iostream>
- #include<cstdlib>
- #include<vector>
- #include<algorithm>
- //#include<conio.h>
- #define long long long
- #define nln '\n'
- using namespace std;
- vector<long> smt, a, t;
- long n, m;
- void build(long id, long lef, long rig)
- {
- if (lef == rig)
- {
- smt[id] = a[lef];
- return;
- }
- long mid = (lef+rig)>>1;
- build(id*2, lef, mid);
- build(id*2+1, mid+1, rig);
- smt[id] = smt[id*2] + smt[id*2+1];
- }
- void push_down(long id)
- {
- smt[id*2] += t[id];
- smt[id*2+1] += t[id];
- t[id*2] += t[id];
- t[id*2+1] += t[id];
- t[id] = 0;
- }
- long get(long id, long lef, long rig, long l, long r)
- {
- if (lef > r || rig < l)
- return 0;
- if (lef >= l && rig <= r)
- return smt[id];
- push_down(id);
- long mid = (lef+rig)>>1;
- return get(id*2, lef, mid, l, r) + get(id*2+1, mid+1, rig, l, r);
- }
- void inc(long id, long lef, long rig, long l, long r, long val)
- {
- if (lef > r || rig < l)
- return;
- if (lef >= l && rig <= r)
- {
- smt[id] += val;
- t[id] += val*(rig-lef+1);
- return;
- }
- push_down(id);
- long mid = (lef+rig)>>1;
- inc(id*2, lef, mid, l, r, val);
- inc(id*2+1, mid+1, rig, l, r, val);
- smt[id] = smt[id*2] + smt[id*2+1];
- }
- int main()
- {
- // Input;
- freopen("querysum2.inp", "r", stdin);
- cin >> n >> m;
- a.resize(n+1, 0);
- for (long i = 1; i <= n; ++i)
- cin >> a[i];
- // Process
- smt.resize(n*4+2, 0);
- t.resize(n*4+2, 0);
- build(1, 1, n);
- for (long i = 1; i <= m; ++i)
- {
- long q;
- cin >> q;
- if (q == 1)
- {
- long lef, rig, val;
- cin >> lef >> rig >> val;
- inc(1, 1, n, lef, rig, val);
- }
- else
- {
- long lef, rig;
- cin >> lef >> rig;
- cout << get(1, 1, n, lef, rig) << nln;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment