#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
namespace wzl{
int n,m;
const int maxnm = 1e5 + 1;
const int maxmn = 1e5 + 1;
int a[maxmn] = {},sgtree[4*maxnm] = {},lazy[4*maxmn] = {};
void buildTree(int s, int t, int node){
printf("%d %d %d\n",s,t,node);
int Lnode = 2*node;
int Rnode = 2*node + 1;
int mid = (s + t)>>1;
if(s == t){
sgtree[node] = a[s];
return;
}
buildTree(s,m,Lnode);
buildTree(m+1,t,Rnode);
sgtree[node] = sgtree[Lnode] + sgtree[Rnode];
return;
}
void update(int s, int t, int l, int r, int p, int node){
int Lnode = 2*node;
int Rnode = Lnode +1;
int mid = (s + t)>>1;
if(l <= s && t <= r){
sgtree[node] += (t-s+1)*p;
lazy[node] += p;
return ;
}
if(!lazy[node] && s!=t){
sgtree[Lnode] += lazy[node]*(m-s+1);
lazy[Lnode] += lazy[node];
sgtree[Rnode] += lazy[node]*(t-m);
lazy[Rnode] += lazy[node];
lazy[node] = 0;
}
if(l <= m) update(s,m,l,r,p,Lnode);
if(r >= m+1) update(m+1,t,l,r,p,Rnode);
sgtree[node] = sgtree[Lnode] + sgtree[Rnode];
return;
}
int getsum(int s,int t,int l,int r,int node){
int Lnode = 2*node;
int Rnode = Lnode +1;
int mid = (s + t)>>1;
if(s <= l && t <= r){
return sgtree[node];
}
if(!lazy[node] && s != t){
sgtree[Lnode] += lazy[node]*(m-s+1);
lazy[Lnode] += lazy[node];
sgtree[Rnode] += lazy[node]*(t-m);
lazy[Rnode] += lazy[node];
lazy[node] = 0;
}
int sum = 0;
if(l <= m) sum += getsum(s,m,l,r,Lnode);
if(r >= m+1) sum += getsum(m+1,t,l,r,Rnode);
return sum;
}
void main(){
cin>>n>>m;
for(int i = 1; i <= n; ++i) cin>>a[i];
buildTree(1,n,1);
// cout<<"qq";
do{
int f; cin>>f;
if(f == 1){
int x,y,k;
cin>>x>>y>>k;
update(1,n,x,y,k,1);
}
if(f == 2){
int x,y;
cin>>x>>y;
cout<<getsum(1,n,x,y,1);
}
}while(--m);
return ;
}
}
int main(){
wzl::main();
}
输出:
1 5 1
1 5 2
1 5 4
1 5 8
1 5 16
1 5 32
1 5 64
1 5 128
1 5 256
1 5 512
1 5 1024
1 5 2048
1 5 4096
1 5 8192
1 5 16384
1 5 32768
1 5 65536
1 5 131072
1 5 262144
1 5 524288
1 5 1048576
1 5 2097152
1 5 4194304
1 5 8388608
1 5 16777216
1 5 33554432
1 5 67108864
1 5 134217728
1 5 268435456
1 5 536870912
1 5 1073741824
1 5 -2147483648
然后就一直是 1 5 0 了