P1438 无聊的数列

https://www.luogu.com.cn/problem/P1438

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ls u<<1
#define rs u<<1|1
#define mid ((l+r)>>1)
const int N=100005;
int a[N];
LL sum[N<<2],tag[N<<2];//区间和,蓝标记
void pushup(int u)
{
	sum[u]=sum[rs]+sum[ls];
}
void pushdown(int u,int l,int r)
{
	sum[ls]+=tag[u]*(mid-l+1);
	sum[rs]+=tag[u]*(r-mid);
	tag[ls]+=tag[u];
	tag[rs]+=tag[u];
	tag[u]=0;
}
void build(int u,int l,int r)
{
	sum[u]=a[l];tag[u]=0;
	if(l==r) return;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(u);
}
void change(int u,int l,int r,int x,int y,LL v)
{
	if(x<=l&&r<=y)//当前区间完全在修改区间里
	{
		sum[u]+=(r-l+1)*v;//更新区间和
		tag[u]+=v;//更新懒标记
		return;
	}
	pushdown(u,l,r);
	if(x<=mid) change(ls,l,mid,x,y,v);
	if(y>mid) change(rs,mid+1,r,x,y,v);
	pushup(u);
}
LL query(int u,int l,int r,int x,int y)//区间查询
{
	if(x<=l&&y>=r) return sum[u];
	pushdown(u,l,r);
	LL s=0;
	if(x<=mid) s+=query(ls,l,mid,x,y);
	if(y>mid) s+=query(rs,mid+1,r,x,y);
	return s;
}
int main()
{
	int n,m,l,r,k,d,p,opt;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=n;i>1;i--) a[i]-=a[i-1];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>opt;
		if(opt==1)
		{
			cin>>l>>r>>k>>d;
			change(1,1,n,l,l,k);
			if(l+1<=r) change(1,1,n,l+1,r,d);
			if(r<n) change(1,1,n,r+1,r+1,-(k+d*(r-l)));
		}
		else
		{
			cin>>p;
			cout<<query(1,1,n,1,p)<<endl;
		}
	}
}

https://www.cnblogs.com/dx123/p/17749777.html

posted @ 2025-08-30 15:39  Lucian2007  阅读(5)  评论(0)    收藏  举报