Y_Naidong @ 2024-07-12 21:18:31
WA求助,样例过不了,看不出问题,求助大佬,HELP!!!
#include<bits/stdc++.h>
using namespace std;
const int N=1e7;
int n,m;
int a[N],tr[N],lazy[N];
void up(int ix){
tr[ix]=tr[ix*2]+tr[ix*2+1];
}
void build(int l,int r,int ix){
if(l==r){
tr[ix]=a[l];
return;
}
int mid=(l+r)/2;
build(l,mid,ix*2);
build(mid+1,r,ix*2+1);
up(ix);
}
void down(int l,int r,int ix){
if(lazy[ix]){
lazy[ix*2]+=lazy[ix];
lazy[ix*2+1]+=lazy[ix];
int mid=(r+l)/2;
tr[ix*2]+=lazy[ix]*(mid+1-l);
tr[ix*2+1]+=lazy[ix]*(r-mid);
lazy[ix]=0;
}
}
void change(int l,int r,int ix,int x,int y,int k){
if(l>=x&&r<=y){
tr[ix]+=k*(r-l+1);
lazy[ix]+=k;
return;
}
down(l,r,ix);
int mid=(r+l)/2;
if(x<=mid)
change(l,mid,ix*2,x,y,k);
if(y>mid)
change(mid+1,r,ix*2+1,x,y,k);
up(ix);
}
int find(int l,int r,int ix,int x,int y){
if(l>=x&&r<=y)
return tr[ix];
int mid=(r+l)/2,ans=0;
if(x<=mid)
ans+=find(l,mid,ix*2,x,y);
if(y>mid)
ans+=find(mid+1,r,ix*2+1,x,y);
return ans;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;i++){
int p,x,y;
cin>>p;
if(p==1){
int k;
cin>>x>>y>>k;
change(1,n,1,x,y,k);
}
if(p==2){
cin>>x>>y;
cout<<find(1,n,1,x,y)<<endl;
}
}
return 0;
}
by Y_Naidong @ 2024-07-12 21:36:41
不用了,没开long long,答案爆了;(