/* RANGE INCREMENT + RANGE SUM QUERIES + ITERATIVE */
using namespace std;
#include <bits/stdc++.h>
struct SegLzy{
typedef long long ll;
#define _ j*2
#define __ j*2+1
vector<ll> S,L; int n,h;
SegLzy(vector<int> ar){
n=ar.size(); h=32-__builtin_clz(n);
S.assign(2*n,0); L.assign(n,0);
for(int i=0;i<n;i++)S[n+i]=ar[i];
for(int j=n-1;j>0;j--)S[j]=S[_]+S[__];
}
inline void Push(int l,int r) {
ll s=h,k=1<<(h-1);
for(l+=n,r+=n-1;s>0;--s,k/=2){
for(int j=l>>s;j<=r>>s;++j)if(L[j]){
S[_] +=L[j]*k;if(_ <n)L[_] +=L[j];
S[__]+=L[j]*k;if(__<n)L[__]+=L[j];
L[j] = 0;
}
}
}
void Updt(int l,int r,int v){
ll s=l+n,e=r-1+n,k=1,j,c;
for(l+=n,r+=n;l<r;l/=2,r/=2,k*=2) {
if(l&1){S[l]+=v*k;if(l<n)L[l]+=v;l++;}
if(r&1){--r;S[r]+=v*k;if(r<n)L[r]+=v;}
}
j=s;c=1;while((j/=2)>0)c*=2,S[j]=S[_]+S[__]+L[j]*c;
j=e;c=1;while((j/=2)>0)c*=2,S[j]=S[_]+S[__]+L[j]*c;
}
long long Kqry(int l,int r,ll res=0){
Push(l,l+1);Push(r-1,r);
for(l+=n,r+=n;l<r;l/=2,r/=2){
if(l&1)res+=S[l++];
if(r&1)res+=S[--r];
}return res;
}
};
int main(){
vector<int> a = {1,2,3,4,5,6,7,8,9,10};
SegLzy S1(a);
cout << S1.Kqry(0,10) << endl;
S1.Updt(3,7,10);
cout << S1.Kqry(3,7) << endl;
S1.Updt(3,7,-10);
cout << S1.Kqry(3,7) << endl;
}
//------------------------------------------------------------------------
// struct SegLzy{
// typedef long long ll;
// vector<int> S,L; ll n,h;
// SegLzy(vector<int> ar){
// n=ar.size(); h=32-__builtin_clz(n);
// S.assign(2*n,0); L.assign(n,0);
// for(int i=0;i<n;i++)S[n+i]=ar[i];
// for(int j=n-1;j>0;j--)S[j]=S[2*j]+S[2*j+1];
// }
// void calc(int p, int k) {
// S[p] = S[p<<1] + S[p<<1|1] + L[p] * k;
// }
// void apply(int p, int value, int k) {
// S[p] += value * k;
// if (p < n) L[p] = value;
// }
// void build(int l, int r) {
// int k = 2;
// for (l += n, r += n-1; l > 1; k <<= 1) {
// l >>= 1, r >>= 1;
// for (int i = r; i >= l; --i) calc(i, k);
// }
// }
// void push(int l, int r) {
// int s = h, k = 1 << (h-1);
// for (l += n, r += n-1; s > 0; --s, k >>= 1)
// for (int i = l >> s; i <= r >> s; ++i) if (L[i] != 0) {
// apply(i<<1, L[i], k);
// apply(i<<1|1, L[i], k);
// L[i] = 0;
// }
// }
// void modify(int l, int r, int value) {
// if (value == 0) return;
// push(l, l + 1);
// push(r - 1, r);
// int l0 = l, r0 = r, k = 1;
// for (l += n, r += n; l < r; l >>= 1, r >>= 1, k <<= 1) {
// if (l&1) apply(l++, value, k);
// if (r&1) apply(--r, value, k);
// }
// build(l0, l0 + 1);
// build(r0 - 1, r0);
// }
// int query(int l, int r) {
// push(l, l + 1);
// push(r - 1, r);
// int res = 0;
// for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
// if (l&1) res += S[l++];
// if (r&1) res += S[--r];
// }
// return res;
// }
// };
// int main(){
// vector<int> a = {1,2,3,4,5,6,7,8,9,10};
// SegLzy S1(a);
// cout << S1.query(0,10) << endl;
// S1.modify(3,7,10);
// cout << S1.query(3,7) << endl;
// S1.modify(3,7,-10);
// cout << S1.query(3,7) << endl;
// }
CgoJCQkJLyogUkFOR0UgSU5DUkVNRU5UICsgUkFOR0UgU1VNIFFVRVJJRVMgKyBJVEVSQVRJVkUgKi8KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgoKc3RydWN0IFNlZ0x6eXsKICAgIHR5cGVkZWYgbG9uZyBsb25nIGxsOwogICAgI2RlZmluZSBfICBqKjIKICAgICNkZWZpbmUgX18gaioyKzEKCiAgICB2ZWN0b3I8bGw+IFMsTDsgaW50IG4saDsKCiAgICBTZWdMenkodmVjdG9yPGludD4gYXIpewogICAgICAgIG49YXIuc2l6ZSgpOyBoPTMyLV9fYnVpbHRpbl9jbHoobik7CiAgICAgICAgUy5hc3NpZ24oMipuLDApOyBMLmFzc2lnbihuLDApOwogICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspU1tuK2ldPWFyW2ldOwogICAgICAgIGZvcihpbnQgaj1uLTE7aj4wO2otLSlTW2pdPVNbX10rU1tfX107ICAKICAgIH0KICAgIGlubGluZSB2b2lkIFB1c2goaW50IGwsaW50IHIpIHsKICAgICAgICBsbCBzPWgsaz0xPDwoaC0xKTsKICAgICAgICBmb3IobCs9bixyKz1uLTE7cz4wOy0tcyxrLz0yKXsKICAgICAgICAgICAgZm9yKGludCBqPWw+PnM7ajw9cj4+czsrK2opaWYoTFtqXSl7CiAgICAgICAgICAgICAgICBTW19dICs9TFtqXSprO2lmKF8gPG4pTFtfXSArPUxbal07CiAgICAgICAgICAgICAgICBTW19fXSs9TFtqXSprO2lmKF9fPG4pTFtfX10rPUxbal07CiAgICAgICAgICAgICAgICBMW2pdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0gICAgICAKICAgIH0KICAgIHZvaWQgVXBkdChpbnQgbCxpbnQgcixpbnQgdil7CiAgICAgICAgbGwgcz1sK24sZT1yLTErbixrPTEsaixjOwogICAgICAgIGZvcihsKz1uLHIrPW47bDxyO2wvPTIsci89MixrKj0yKSB7CiAgICAgICAgICAgIGlmKGwmMSl7U1tsXSs9diprO2lmKGw8bilMW2xdKz12O2wrKzt9CiAgICAgICAgICAgIGlmKHImMSl7LS1yO1Nbcl0rPXYqaztpZihyPG4pTFtyXSs9djt9CiAgICAgICAgfQogICAgICAgIGo9cztjPTE7d2hpbGUoKGovPTIpPjApYyo9MixTW2pdPVNbX10rU1tfX10rTFtqXSpjOwogICAgICAgIGo9ZTtjPTE7d2hpbGUoKGovPTIpPjApYyo9MixTW2pdPVNbX10rU1tfX10rTFtqXSpjOwogICAgfQogICAgbG9uZyBsb25nIEtxcnkoaW50IGwsaW50IHIsbGwgcmVzPTApewogICAgICAgIFB1c2gobCxsKzEpO1B1c2goci0xLHIpOwogICAgICAgIGZvcihsKz1uLHIrPW47bDxyO2wvPTIsci89Mil7CiAgICAgICAgICAgIGlmKGwmMSlyZXMrPVNbbCsrXTsKICAgICAgICAgICAgaWYociYxKXJlcys9U1stLXJdOwogICAgICAgIH1yZXR1cm4gcmVzOwogICAgfQp9OwoKaW50IG1haW4oKXsKICAgIHZlY3RvcjxpbnQ+IGEgPSB7MSwyLDMsNCw1LDYsNyw4LDksMTB9OwogICAgU2VnTHp5IFMxKGEpOwogICAgY291dCA8PCBTMS5LcXJ5KDAsMTApIDw8IGVuZGw7CiAgICBTMS5VcGR0KDMsNywxMCk7CiAgICBjb3V0IDw8IFMxLktxcnkoMyw3KSA8PCBlbmRsOwogICAgUzEuVXBkdCgzLDcsLTEwKTsKICAgIGNvdXQgPDwgUzEuS3FyeSgzLDcpIDw8IGVuZGw7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBzdHJ1Y3QgU2VnTHp5ewovLyAgICAgdHlwZWRlZiBsb25nIGxvbmcgbGw7Ci8vICAgICB2ZWN0b3I8aW50PiBTLEw7IGxsIG4saDsKCi8vICAgICBTZWdMenkodmVjdG9yPGludD4gYXIpewovLyAgICAgICAgIG49YXIuc2l6ZSgpOyBoPTMyLV9fYnVpbHRpbl9jbHoobik7Ci8vICAgICAgICAgUy5hc3NpZ24oMipuLDApOyBMLmFzc2lnbihuLDApOwovLyAgICAgICAgIGZvcihpbnQgaT0wO2k8bjtpKyspU1tuK2ldPWFyW2ldOwovLyAgICAgICAgIGZvcihpbnQgaj1uLTE7aj4wO2otLSlTW2pdPVNbMipqXStTWzIqaisxXTsgIAovLyAgICAgfQoKLy8gICAgIHZvaWQgY2FsYyhpbnQgcCwgaW50IGspIHsKLy8gICAgICAgICBTW3BdID0gU1twPDwxXSArIFNbcDw8MXwxXSArIExbcF0gKiBrOwovLyAgICAgfQogICAgCi8vICAgICB2b2lkIGFwcGx5KGludCBwLCBpbnQgdmFsdWUsIGludCBrKSB7Ci8vICAgICAgICAgU1twXSArPSB2YWx1ZSAqIGs7Ci8vICAgICAgICAgaWYgKHAgPCBuKSBMW3BdID0gdmFsdWU7Ci8vICAgICB9CgovLyAgICAgdm9pZCBidWlsZChpbnQgbCwgaW50IHIpIHsKLy8gICAgICAgICBpbnQgayA9IDI7Ci8vICAgICAgICAgZm9yIChsICs9IG4sIHIgKz0gbi0xOyBsID4gMTsgayA8PD0gMSkgewovLyAgICAgICAgICAgICBsID4+PSAxLCByID4+PSAxOwovLyAgICAgICAgICAgICBmb3IgKGludCBpID0gcjsgaSA+PSBsOyAtLWkpIGNhbGMoaSwgayk7Ci8vICAgICAgICAgfQovLyAgICAgfQoKLy8gICAgIHZvaWQgcHVzaChpbnQgbCwgaW50IHIpIHsKLy8gICAgICAgICBpbnQgcyA9IGgsIGsgPSAxIDw8IChoLTEpOwovLyAgICAgICAgIGZvciAobCArPSBuLCByICs9IG4tMTsgcyA+IDA7IC0tcywgayA+Pj0gMSkKLy8gICAgICAgICAgICAgZm9yIChpbnQgaSA9IGwgPj4gczsgaSA8PSByID4+IHM7ICsraSkgaWYgKExbaV0gIT0gMCkgewovLyAgICAgICAgICAgICAgICAgYXBwbHkoaTw8MSwgTFtpXSwgayk7Ci8vICAgICAgICAgICAgICAgICBhcHBseShpPDwxfDEsIExbaV0sIGspOwovLyAgICAgICAgICAgICAgICAgTFtpXSA9IDA7Ci8vICAgICAgICAgICAgIH0KLy8gICAgIH0KCi8vICAgICB2b2lkIG1vZGlmeShpbnQgbCwgaW50IHIsIGludCB2YWx1ZSkgewovLyAgICAgICAgIGlmICh2YWx1ZSA9PSAwKSByZXR1cm47Ci8vICAgICAgICAgcHVzaChsLCBsICsgMSk7Ci8vICAgICAgICAgcHVzaChyIC0gMSwgcik7Ci8vICAgICAgICAgaW50IGwwID0gbCwgcjAgPSByLCBrID0gMTsKLy8gICAgICAgICBmb3IgKGwgKz0gbiwgciArPSBuOyBsIDwgcjsgbCA+Pj0gMSwgciA+Pj0gMSwgayA8PD0gMSkgewovLyAgICAgICAgICAgICBpZiAobCYxKSBhcHBseShsKyssIHZhbHVlLCBrKTsKLy8gICAgICAgICAgICAgaWYgKHImMSkgYXBwbHkoLS1yLCB2YWx1ZSwgayk7Ci8vICAgICAgICAgfQovLyAgICAgICAgIGJ1aWxkKGwwLCBsMCArIDEpOwovLyAgICAgICAgIGJ1aWxkKHIwIC0gMSwgcjApOwovLyAgICAgfQoKLy8gICAgIGludCBxdWVyeShpbnQgbCwgaW50IHIpIHsKLy8gICAgICAgICBwdXNoKGwsIGwgKyAxKTsKLy8gICAgICAgICBwdXNoKHIgLSAxLCByKTsKLy8gICAgICAgICBpbnQgcmVzID0gMDsKLy8gICAgICAgICBmb3IgKGwgKz0gbiwgciArPSBuOyBsIDwgcjsgbCA+Pj0gMSwgciA+Pj0gMSkgewovLyAgICAgICAgICAgICBpZiAobCYxKSByZXMgKz0gU1tsKytdOwovLyAgICAgICAgICAgICBpZiAociYxKSByZXMgKz0gU1stLXJdOwovLyAgICAgICAgIH0KLy8gICAgICAgICByZXR1cm4gcmVzOwovLyAgICAgfQovLyB9OwoKLy8gaW50IG1haW4oKXsKLy8gICAgIHZlY3RvcjxpbnQ+IGEgPSB7MSwyLDMsNCw1LDYsNyw4LDksMTB9OwovLyAgICAgU2VnTHp5IFMxKGEpOwovLyAgICAgY291dCA8PCBTMS5xdWVyeSgwLDEwKSA8PCBlbmRsOwovLyAgICAgUzEubW9kaWZ5KDMsNywxMCk7Ci8vICAgICBjb3V0IDw8IFMxLnF1ZXJ5KDMsNykgPDwgZW5kbDsKLy8gICAgIFMxLm1vZGlmeSgzLDcsLTEwKTsKLy8gICAgIGNvdXQgPDwgUzEucXVlcnkoMyw3KSA8PCBlbmRsOwovLyB9Cg==