Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- #define ll long long int
- #define rep(i,a,n) for(int i = a; i < n; i++)
- #define A(v) (v.begin(), v.end())
- #define s(x) scanf("%I64d", &x)
- #define S(x) scanf("%d", &x)
- const int N = 1e5+5;
- vector < long long int > tree(N << 2), lazy(N << 2);
- void prop(int node, int l, int r){
- if(lazy[node]){
- tree[node] += (r - l + 1) * lazy[node];
- if(l - r){
- int lr = node + node;
- lazy[lr] += lazy[node];
- lazy[lr | 1] += lazy[node];
- }
- lazy[node] = 0;
- }
- }
- void update(int l, int r, int ql, int qr, int val, int node){
- prop(node, l ,r);
- if(qr < l or ql > r)return ;
- if(ql <= l and r <= qr){
- lazy[node] = val;
- if(l != r)
- prop(node, 1, 0);
- tree[node] += 1LL * (r-l+1) * val;
- lazy[node] = 0;
- return ;
- }
- int mid = (l + r) >> 1, lc = node + node;
- update(l, mid, ql, qr, val, lc);
- update(mid + 1, r, ql, qr, val, lc | 1);
- tree[node] = tree[lc] + tree[lc | 1];
- }
- ll query(int l, int r, int ql, int qr, int node){
- prop(node, l, r);
- if(qr < l or ql > r)return 0LL;
- if(ql <= l and r <= qr)return tree[node];
- int mid = (l+r) >> 1;
- return (query(l, mid, ql, qr, node << 1) + query(mid + 1, r, ql, qr, 2*node + 1));
- }
- signed main(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- int t;
- cin >> t;
- while(t--){
- int n, i, l, r, q, cnt = 0,ch, val;
- for(i = 0; i < N * 4; i++)tree[i] = 0, lazy[i] = 0;
- cin >> n >> q;
- while(q--){
- cin >> ch >> l >> r;
- if(ch == 1)
- cout << (query(1, n, l, r, 1)) << '\n';
- else
- cin >> val,update(1, n, l, r, val,1);
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment