样例输出3,求调
查看原帖
样例输出3,求调
728840
covonant楼主2025/1/29 21:02
#include<iostream>
#define maxn 100005
using namespace std;
int tree[maxn*4],fot[maxn*4],dif[maxn*4],a[maxn]; 
int n,q;
void build(int u,int L,int R){
	if(L==R){
		tree[u]=a[L];
		return;
	}
	int M=(L+R)/2;
	build(u*2,L,M);
	build(u*2+1,M+1,R);
}
void pushdown(int u,int L,int R){
	int M=(L+R)/2;
	fot[u*2]+=fot[u];
	fot[u*2+1]+=fot[u]+(R-M-1)*dif[u];
	dif[u*2]+=dif[u];
	dif[u*2+1]+=dif[u];
	tree[u*2]+=((M-L)*dif[u*2]+fot[u*2]+fot[u*2])*(M-L+1)/2;
	tree[u*2+1]+=((R-M-1)*dif[u*2+1]+fot[u*2+1]+fot[u*2+1])*(R-M)/2;
	fot[u]=dif[u]=0;
}
void update(int u,int L,int R,int l,int r,int k,int d){
	if(l<=L&&R<=r){
		fot[u]+=k;
		dif[u]+=d;
		tree[u]+=((R-L)*dif[u]+fot[u]+fot[u])*(R-L+1)/2;
		return;
	}
	int M=(L+R)/2;
	pushdown(u,L,R); 
	if(l<=M) update(u*2,L,M,l,r,k,d);
	else update(u*2+1,M+1,R,l,r,k+(M-L+1)*d,d);
}
int query(int u,int L,int R,int p){
	if(L==R){
		return tree[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+1,M+1,R,p);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(q--){
		int opt,x,y,z,h;
		cin>>opt;
		if(opt==1){
			cin>>x>>y>>z>>h;
			update(1,1,n,x,y,z,h);
		}else{
			cin>>x;
			cout<<query(1,1,n,x)<<"\n";
		}
	}
	return 0;
} 
2025/1/29 21:02
加载中...