P3372 【模板】线段树 1
后面7个点全部RE
#include<bits/stdc++.h>
#define ll long long
#define ss stable_sort
#define inf INT_MAX
#define re register
#define tL(p) tree[p].L=L
#define tR(p) tree[p].R=R
#define t0(p) tree[p].add=0
#define TREE(p) tL(p);tR(p);t0(p);
#define IF if(L==R)
#define IF2 if(tree[p].L==L&&tree[p].R==R)
#define Ret return
#pragma GCC opitimize(3)
using namespace std;
const int N(1<<5);
ll n,m,s[N];
struct node{
ll L,R;
ll sum,add;
ll mid(){
Ret (L+R)>>1;
}
}tree[4*N];
void up(ll p){
tree[p].sum=tree[2*p].sum+tree[2*p+1].sum;
}
void down(ll p){
if(tree[p].add==0)return;
tree[2*p].sum+=(tree[2*p].R-tree[2*p].L+1)*tree[p].add;
tree[2*p+1].sum+=(tree[2*p+1].R-tree[2*p+1].L+1)*tree[p].add;
tree[2*p].add+=tree[p].add;
tree[2*p+1].add+=tree[p].add;
tree[p].add=0;
}
void build(ll L,ll R,ll p){
TREE(p)
IF{
tree[p].sum=s[L];
Ret;
}
ll mid=tree[p].mid();
build(L,mid,2*p);
build(mid+1,R,2*p+1);
up(p);
}
void update(ll L,ll R,ll a,ll p){
IF2{
tree[p].sum+=(R-L+1)*a;
tree[p].add+=a;
Ret;
}
down(p);
int mid=tree[p].mid();
if(R<=mid) update(L,R,a,2*p);
else if(L>mid) update(L,R,a,2*p+1);
else{
update(L,mid,a,2*p);
update(mid+1,R,a,2*p+1);
}
up(p);
}
ll query(ll L,ll R,ll p){
IF2{
Ret tree[p].sum;
}
down(p);
ll mid=tree[p].mid();
if(R<=mid) return query(L,R,2*p);
else if(L>mid) return query(L,R,2*p+1);
else return query(L,mid,2*p)+query(mid+1,R,2*p+1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i];
build(1,n,1);
for(int i=1;i<=m;i++){
short int op;
cin>>op;
if(op==1){
ll x,y,a;
cin>>x>>y>>a;
update(x,y,a,1);
}else{
ll x,y;
cin>>x>>y;
cout<<query(x,y,1)<<endl;
}
}
Ret 0;
}