0pts 看不出问题所在,悬赏关注(大号小号)
查看原帖
0pts 看不出问题所在,悬赏关注(大号小号)
807853
I_am_AKed_by_NOI楼主2023/7/15 01:03
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=1e6+10;
struct node
{
	int l,r,sum;
	int tag;
}tree[4*N];
int n,m,a[N],opt,l,r,k,d;
void build(int x,int y,int p)
{
	tree[p].l=x,tree[p].r=y;
	if(x==y)
	{
		tree[p].sum=a[x];
		return ;
	}
	int mid=x+y>>1;
	build(x,mid,p<<1);
	build(mid+1,y,p<<1|1);
	tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum; 
}
void pushdown(int p)
{
	if(tree[p].tag)
	{
		tree[p<<1].sum+=(tree[p<<1].r-tree[p<<1].l+1)*tree[p].tag;
		tree[p<<1|1].sum+=(tree[p<<1|1].r-tree[p<<1|1].l+1)*tree[p].tag;
		tree[p<<1].tag+=tree[p].tag;
		tree[p<<1|1].tag+=tree[p].tag;
		tree[p].tag=0;
	}
}
void update(int x,int y,int z,int p)
{
	if(tree[p].l>=x && tree[p].r<=y)
	{
		tree[p].sum+=(tree[p].r-tree[p].l+1)*z;
		tree[p].tag+=z;
		return ;
	}
	pushdown(p);
	int mid=tree[p].l+tree[p].r>>1; 
	if(x<=mid) update(x,y,z,p<<1);
	if(y>mid) update(x,y,z,p<<1|1);
	tree[p].sum=tree[p<<1].sum+tree[p<<1|1].sum; 
}
int query(int x,int y,int p)
{
	if(tree[p].l>=x && tree[p].r<=y)
	{
		return tree[p].sum;
	}
	pushdown(p);
	int res=0,mid=tree[p].l+tree[p].r>>1;
	if(x<=mid) res+=query(x,y,p<<1);
	if(y>mid) res+=query(x,y,p<<1|1);
	return res; 
}
signed main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=n-1;i>0;i--)
        a[i+1]=a[i+1]-a[i];
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		if(opt==1)
		{
			cin>>l>>r>>k>>d;
			update(l,l,k,1);
			update(l+1,r,d,1);
			int e=k+(r-l+1)*d;
			update(r+1,r+1,-e,1); 
		} 
		else
		{
			cin>>l;
			cout<<query(1,l,1)<<endl;
		}
	}
}
2023/7/15 01:03
加载中...