求助——前三个点RE
查看原帖
求助——前三个点RE
159959
虫洞吞噬者楼主2021/10/4 19:54

RT,求大佬指正

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
ll num[1001000],cha[1001000];
struct node{
	int l,r;
	ll sum,lz;
}tree[5005000];
inline void pushup(int id)
{
	tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;
}
inline void pushdown(int id)
{
	if(!tree[id].lz)return;
	tree[id*2].lz+=tree[id].lz;
	tree[id*2+1].lz+=tree[id].lz;
	int mid=(tree[id].l+tree[id].r)/2;
	tree[id*2].sum+=(mid-tree[id].l+1)*tree[id].lz;
	tree[id*2+1].sum+=(tree[id].r-mid)*tree[id].lz;
	tree[id].lz=0;
}
void build(int id,int l,int r)
{
	tree[id].l=l;tree[id].r=r;
	if(l==r)
	{
		tree[id].sum=cha[l];
		return;
	}
	int mid=(l+r)/2;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	pushup(id);
}
void addd(int id,int p,ll k)
{
	if(tree[id].l==tree[id].r&&tree[id].l==p)
	{
		tree[id].sum+=k;
		return;
	}
	pushdown(id);
	int mid=(tree[id].l+tree[id].r)/2;
	if(p<=mid)addd(id*2,p,k);
	if(p>mid)addd(id*2+1,p,k);
	pushup(id);
}
void addq(int id,int l,int r,ll k)
{
	if(l<=tree[id].l&&tree[id].r<=r)
	{
		tree[id].lz+=k;
		tree[id].sum+=(tree[id].r-tree[id].l+1)*k;
		return;
	}
	pushdown(id);
	int mid=(tree[id].l+tree[id].r)/2;
	if(l<=mid)addq(id*2,l,r,k);
	if(r>mid)addq(id*2+1,l,r,k);
	pushup(id);
}
ll find(int id,int l,int r)
{
	if(l<=tree[id].l&&tree[id].r<=r)return tree[id].sum;
	pushdown(id);
	ll sum=0;
	int mid=(tree[id].l+tree[id].r)/2;
	if(l<=mid)sum+=find(id*2,l,r);
	if(r>mid)sum+=find(id*2+1,l,r);
	return sum;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",&num[i]);
		cha[i]=num[i]-num[i-1];
	}
	build(1,1,n);
	for(int i=1;i<=m;++i)
	{
		int l,r,k;
		ll s,d;
		scanf("%d",&k);
		if(k==1)
		{
			scanf("%d%d%lld%lld",&l,&r,&s,&d);
			addd(1,l,s);
			ll cur=s+(r-l)*d;
			addd(1,r+1,-cur);
			addq(1,l+1,r,d);
		}
		else
		{
			int p;
			scanf("%d",&p);
			ll ans=find(1,1,p);
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2021/10/4 19:54
加载中...