0 分求调
查看原帖
0 分求调
490978
小超手123楼主2022/9/28 20:33
#include<bits/stdc++.h>
#define maxn 400005
#define ll long long
using namespace std;
ll n,m,w[maxn],layk[maxn],layd[maxn],a[maxn];
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 mid=(L+R)/2;
	build(u*2,L,mid);
	build(u*2+1,mid+1,R);
	pushup(u);
}
int mo(int k,int d,int len){ //末项 
	return k+(len-1)*d;
}
void maketag(int u,int k,int d,int len){
	layk[u]+=k;
	layd[u]+=d;
	w[u]=w[u]+(k+mo(k,d,len))*len/2;
}
void pushdown(int u,int L,int R){
	int mid=(L+R)/2;
	maketag(u*2,  layk[u],layd[u],mid-L+1);
	maketag(u*2+1,layk[u],layd[u],R-mid);
	layk[u]=0;
	layd[u]=0;
}
bool OutofRange(int L,int R,int l,int r){
	return R<l||r<L;
}
bool InRange(int L,int R,int l,int r){
	return l<=L&&R<=r;
}
void update(int u,int L,int R,int l,int r,int k,int d){
	if(InRange(L,R,l,r)){
		maketag(u,k,d,R-L+1);
		return;
	}
	if(OutofRange(L,R,l,r))return;
	pushdown(u,L,R);
	int mid=(L+R)/2;
	update(u*2,  L,  mid,l,r,k,d);
	update(u*2+1,mid+1,R,l,r,k,d);
	pushup(u);
}
ll query(int u,int L,int R,int p){
	if(L==R){
		return w[u];
	}
	pushdown(u,L,R);
	int mid=(L+R)/2;
	if(p<=mid)return query(u*2,L,mid,p);
	else return query(u*2+1,mid+1,R,p);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	//for(int i=1;i<=n;i++)cout<<query(1,1,n,i)<<" ";
	//cout<<endl;
	for(int i=1;i<=m;i++){
		int 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)<<endl;
		} 
	}
	//for(int i=1;i<=n;i++)cout<<query(1,1,n,i)<<" ";
	return 0;
} 
2022/9/28 20:33
加载中...