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;
}
}
}

浙公网安备 33010602011771号