82pts,#2#4玄关求调
查看原帖
82pts,#2#4玄关求调
1491104
Jimmy_gongtengxin2楼主2025/6/24 21:19
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+5;
int n,m;
int v[maxn<<2],lz[maxn<<2],a[maxn];
void build(int x,int l,int r);
void update(int x);
void download(int x,int l,int r);
void add(int x,int l,int r,int ql,int qr,int c);
int query(int x,int l,int r,int ql,int qr);
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=n;i;i--){
		a[i]=a[i]-a[i-1];
	}
	build(1,1,n);
	while(m--){
		int opt;
		cin>>opt;
		if(opt==1){
			int l,r,k,d;
			cin>>l>>r>>k>>d;
			add(1,1,n,l,l,k);
			if(l!=n)add(1,1,n,l+1,r,d);
			if(l!=n)add(1,1,n,r+1,r+1,-k-d*(r-l));
		}else{
			int p;
			cin>>p;
			cout<<query(1,1,n,1,p)<<'\n';
		}
	}
	return 0;
}
void build(int x,int l,int r){
	if(l==r){
		v[x]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	update(x);
}
void update(int x){
	v[x]=v[x<<1]+v[x<<1|1];
}
void download(int x,int l,int r){
	int mid=(l+r)>>1;
	v[x<<1]+=lz[x]*(mid-l+1),v[x<<1|1]+=lz[x]*(r-mid);
	lz[x<<1]+=lz[x],lz[x<<1|1]+=lz[x];
	lz[x]=0;
}
void add(int x,int l,int r,int ql,int qr,int c){
	if(ql<=l && qr>=r){
		v[x]+=c*(r-l+1);
		lz[x]+=c;
		return ;
	}
	download(x,l,r);
	int mid=(l+r)>>1;
	if(ql<=mid)add(x<<1,l,mid,ql,qr,c);
	if(qr>mid)add(x<<1|1,mid+1,r,ql,qr,c);
	update(x);
}
int query(int x,int l,int r,int ql,int qr){
	if(ql<=l && qr>=r){
		return v[x];
	}
	download(x,l,r);
	int mid=(l+r)>>1;
	int res=0;
	if(ql<=mid)res+=query(x<<1,l,mid,ql,qr);
	if(qr>mid)res+=query(x<<1|1,mid+1,r,ql,qr);
	return res;
}
2025/6/24 21:19
加载中...