蒟蒻求修改 样例输出负数
查看原帖
蒟蒻求修改 样例输出负数
728840
covonant楼主2024/11/18 13:58
#include<iostream>
#define maxn 100005
using namespace std;
int w[maxn*4],a[maxn],tag[maxn*4];
int n,m;
int add;
void pushup(int u){
	w[u]=w[u*2]+w[u*2+1];
}
void build(int u,int L,int R){
	if(L==R){
		w[u]=a[L];
		return;
	}
	int M=(L+R)/2;
	build(u*2,L,M);
	build(u*2+1,M+1,R);
	pushup(u);
}
int Sumary(int k,int d,int len){
	int l=k+(len-1)*d;
	return (k+l)*len/2; 
}
void maketag(int u,int len,int k){
	w[u]+=Sumary(k,add,len);
	tag[u]+=k;
}
void pushdown(int u,int L,int R){
	int M=(L+R)/2;
	maketag(u*2,M-L+1,tag[u]-add);
	maketag(u*2,R-M,tag[u]-add);
	tag[u]=0;
}
int query(int u,int L,int R,int p){
	if(R==L){
		return w[u];
	}
	int M=(L+R)/2;
	pushdown(u,L,R);
	if(p<=M){
		return query(u*2,L,M,p);
	}else{
		return query(u*2,M+1,R,p);
	}
}
bool InRange(int L,int R,int l,int r){
	//判断区间[L,R]是否完全在[l,r]内
	return (l<=L)&&(R<=r); 
}
bool OutofRange(int L,int R,int l,int r){
	return R<l||L>r;
}
void update(int u,int L,int R,int l,int r,int k){
	if(InRange(L,R,l,r)){
		maketag(u,R-L+1,k);
		return;
	}else if(!OutofRange(L,R,l,r)){
		int M=(L+R)/2;
		pushdown(u,L,R);
		update(u*2,L,M,l,r,k);
		update(u*2+1,M+1,R,l,r,k);
		pushup(u);
		return;
	}
}
int main(){
	int l,r,k,opt,p;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		cin>>opt;
		if(opt==1){
			cin>>l>>r>>k>>add;
			update(1,1,n,l,r,k);
		}else{
			cin>>p;
			cout<<query(1,1,n,p)<<"\n";
		}
	}
	return 0;
} 
2024/11/18 13:58
加载中...