0pts求条码风优良
查看原帖
0pts求条码风优良
728840
covonant楼主2024/11/20 13:40
#include<iostream>
#define maxn 100005
#define LL long long
using namespace std;
LL n,m;
LL w[maxn*4],tagk[maxn*4],tagd[maxn*4],a[maxn];
void pushup(LL u){
	w[u]=w[u*2]+w[u*2+1];
}
bool InRange(LL L,LL R,LL l,LL r){
	//判断区间[L,R]是否完全在[l,r]内 
	return (l<=L)&&(R<=r);
}
bool OutofRange(LL L,LL R,LL l,LL r){
	//判断区间[L,R]是否与[l,r]无交集 
	return (R<l)||(L>r); 
}
LL sumary(LL len,LL tk,LL td){
	LL tn=(len-1)*td+tk;
	return (tk+tn)*len/2;
}
void maketag(LL u,LL len,LL tk,LL td){
	w[u]+=sumary(len,tk,td);
	tagk[u]+=tk;
	tagd[u]+=td;
}
void pushdown(LL u,LL L,LL R){
	LL M=(L+R)/2;
	maketag(u*2,M-L+1,tagk[u],tagd[u]);
	maketag(u*2+1,R-M,tagk[u]+(M-L+1)*tagd[u],tagd[u]);
	tagk[u]=tagd[u]=0;
}
void build(LL u,LL L,LL R){
	if(L==R){
		w[u]=a[L];
		return;
	}
	LL M=(L+R)/2;
	build(u*2,L,M);
	build(u*2+1,M+1,R);
	pushup(u);
}
LL query(LL u,LL L,LL R,LL p){//查找第p个数的值  
	if(L==R){
		return w[u];
	}
	pushdown(u,L,R);
	LL M=(L+R)/2;
	if(p<=M){
		return query(u*2,L,M,p);
	}
	return query(u*2,M+1,R,p);
}
void update(LL u,LL L,LL R,LL l,LL r,LL tk,LL td){
	if(InRange(L,R,l,r)){
		maketag(u,R-L+1,tk,td);
		return;
	}else if(!OutofRange(L,R,l,r)){
		LL M=(L+R)/2;
		pushdown(u,L,R);
		update(u*2,L,M,l,r,tk,td);
		update(u*2,M+1,R,l,r,tk,td);
		pushup(u);
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(LL i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		LL opt,l,r,k,d,p;
		cin>>opt;
		if(opt==1){
			cin>>l>>r>>k>>d;
			update(1,1,n,l,r,k,d);
		}else{
			cin>>p;
			cout<<query(1,1,n,p)<<"\n";
		}
	}
	return 0;
}
2024/11/20 13:40
加载中...