全WA,但找不到错误
查看原帖
全WA,但找不到错误
275090
Albet楼主2021/7/31 12:07
#include<iostream>
#include<algorithm>
using namespace std;
long long n,m;
struct inval{
	long long il,ir,num,lz;
}inv[400010];
long long a[100010];
void pushup(long long at){
	inv[at].num=inv[at<<1].num+inv[(at<<1)|1].num;
	return;
}
void pushdown(long long at){
	inv[at<<1].lz=inv[(at<<1)|1].lz=inv[at].lz;
	inv[at<<1].num+=inv[at].lz*(inv[at<<1].ir-inv[at<<1].il+1);
	inv[(at<<1)|1].num+=inv[at].lz*(inv[(at<<1)|1].ir-inv[(at<<1)|1].il+1);
	inv[at].lz=0;
	return;
}
void build(long long l,long long r,long long at){
	inv[at].il=l;inv[at].ir=r;inv[at].lz=0;
	long long m=(l+r)>>1;
	if(l==r){
		inv[at].num=a[m];
		return;
	}
	build(l,m,at<<1);
	build(m+1,r,(at<<1)|1);
	pushup(at);
	return;
}
void update(long long l,long long r,long long dis,long long at){
	if(l<=inv[at].il&&inv[at].ir<=r){
		inv[at].num+=dis*(inv[at].ir-inv[at].il+1);
		inv[at].lz+=dis;
		return;
	}
	long long m=(inv[at].il+inv[at].ir)>>1;
	pushdown(at);
	if(l<=m)update(l,r,dis,at<<1);
	if(m<r)update(l,r,dis,(at<<1)|1);
	pushup(at);
	return;
}
long long getn(long long l,long long r,long long at){
//	cout<<l<<" "<<r<<" "<<at<<endl;
	long long ans=0;
	if(l<=inv[at].il&&inv[at].ir<=r)return inv[at].num;
	long long m=(inv[at].il+inv[at].ir)>>1;
	pushdown(at);
	if(l<=m)ans+=getn(l,r,at<<1);
	if(m<r)ans+=getn(l,r,(at<<1)|1);
	return ans;
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	for(long long i=1,s,x,y,k;i<=m;i++){
		cin>>s;
		if(s==1){
			cin>>x>>y>>k;
			update(x,y,k,1);
		}else{
			cin>>x>>y; 
			cout<<getn(x,y,1)<<endl;
		}
	}
	return 0;
}
2021/7/31 12:07
加载中...