rt,好久没写代码了,写了一份线段树模板,结果开 O2 全 TLE,不开就 A 了
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define left q*2
#define right q*2+1
#define zqj tre[q].l
#define yqj tre[q].r
struct xds{
int l;
int r;
int sum;
int add;
int oin(int q,int p,int t){
l=q;
r=p;
sum=t;
add=0;
}
}tre[500005];
int x,y;
int m[100005];
void pushup(int q){
tre[q].sum=tre[left].sum+tre[right].sum;
}
void pushdown(int q){
if(tre[q].add>0){
tre[left].sum+=((tre[left].r-tre[left].l+1)*tre[q].add);
tre[left].add+=tre[q].add;
tre[right].sum+=((tre[right].r-tre[right].l+1)*tre[q].add);
tre[right].add+=tre[q].add;
tre[q].add=0;
}
}
void js(int q,int l,int r){
tre[q].oin(l,r,m[l]);
if(l==r) return ;
int mid=l+r>>1;
js(left,l,mid);
js(right,mid+1,r);
pushup(q);
return ;
}
void qjjf(int q,int ml,int mr,int k){
if(ml<=zqj&&mr>=yqj){
tre[q].sum+=((yqj-zqj+1)*k);
tre[q].add+=k;
return ;
}
pushdown(q);
int mid=zqj+yqj>>1;
if(ml<=mid) qjjf(left,ml,mr,k);
if(mr>mid) qjjf(right,ml,mr,k);
pushup(q);
}
int qjqh(int q,int ml,int mr){
if(zqj>=ml&&yqj<=mr) return tre[q].sum;
pushdown(q);
int mid=zqj+yqj>>1;
int da=0;
if(ml<=mid) da+=qjqh(left,ml,mr);
if(mr>mid) da+=qjqh(right,ml,mr);
return da;
}
signed main(){
cin>>x>>y;
for(int i=1;i<=x;i++){
cin>>m[i];
}
js(1,1,x);
for(int i=1;i<=y;i++){
int a;
cin>>a;
if(a==1){
int b,c,d;
cin>>b>>c>>d;
qjjf(1,b,c,d);
}
if(a==2){
int b,c;
cin>>b>>c;
cout<<qjqh(1,b,c)<<endl;
}
}
return 0;
}