跟着老师写了一遍但是发现我的答案对不上,问了AI他也找不到,求各位大佬帮帮我!十分感谢!!
#include<bits/stdc++.h>
using namespace std;
int n,m,in[400100],ans[400100];
int lazy[400100];
void build(int noww,int lt,int rt){
lazy[noww] = 0;
if(lt == rt){
ans[lt] = in[lt];
return;
}
int mid = (lt + rt) >> 1;
build(noww * 2,lt,mid);
build(noww * 2 + 1,mid + 1,rt);
ans[noww] = ans[noww * 2] + ans[noww * 2 + 1];
}
void makelazy(int noww,int l,int r,int addnum){
lazy[noww] += addnum;
ans[noww] = ans[noww] + (r - l + 1) * addnum;
}
void newlazy(int noww,int l,int r){
int mid = (l + r) >> 1;
makelazy(noww * 2,l,mid,lazy[noww]);
makelazy(noww * 2 + 1,mid + 1,r,lazy[noww]);
lazy[noww] = 0;
}
void addnumber(int adl,int adr,int noww,int l,int r,int addnum){
//adl为增加数的区间的左端点,adr为增加数的区间的右端点
//l,r分别为当前操作的区间的左右端点
if(adl <= l && r <= adr){
lazy[noww] += addnum;
ans[noww] += (r - l + 1) * addnum;
return;
}
newlazy(noww,l,r);
int mid = (l + r) >> 1;
if(adl < mid){
addnumber(adl,adr,noww * 2,l,mid,addnum);
}
if(adr > mid){
addnumber(adl,adr,noww * 2 + 1,mid + 1,r,addnum);
}
ans[noww] = ans[noww * 2] + ans[noww * 2 + 1];
}
int searching(int sl,int sr,int noww,int l,int r){
if(sl <= l && sr >= r){
return ans[noww];
}
int res = 0,mid = (l + r) >> 1;
newlazy(noww,l,r);
if(sl <= mid){
res += searching(sl,sr,noww * 2,l,mid);
}
if(sr > mid){
res += searching(sl,sr,noww * 2 + 1,mid + 1,r);
}
return res;
}
int main(){
ios_base::sync_with_stdio(false);
cin>>n>>m;
for(int i = 1;i <= n;i++){
cin>>in[i];
}
build(1,1,n);
int md,x,y,z;
while(m != 0){
m--;
cin>>md;
if(md == 1){
cin>>x>>y>>z;
addnumber(x,y,1,1,n,z);
}else{
cin>>x>>y;
cout<<searching(x,y,1,n,1)<<endl;
}
}
return 0;
}