91 pts #2 WA
查看原帖
91 pts #2 WA
576934
Kevin_Mamba楼主2022/12/23 10:29
#include<bits/stdc++.h>
#define il inline
#define re register
using namespace std;
typedef long long ll;

const int N=2e5+10;

int n,m,a[N];

struct T
{
	int l,r;
	ll K,D;
}t[N<<2];

il void build(re int p,re int l,re int r)
{
	t[p].l=l;
	t[p].r=r;
	t[p].K=t[p].D=0;
	if(l==r)
	{
		t[p].K=a[l];
		return ;
	}
	re int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
}

il void pushdown(re int p)
{
	if(t[p].K)
	{
		t[p<<1].K+=t[p].K;
		t[p<<1].D+=t[p].D;
		t[p<<1|1].K+=t[p].K+t[p].D*(t[p<<1|1].l-t[p].l);
		t[p<<1|1].D+=t[p].D;
		t[p].K=t[p].D=0;
	}
}

il void modify(re int p,re int l,re int r,re int K,re int D)
{
	if(l<=t[p].l&&t[p].r<=r)
	{
		t[p].K+=K+D*(t[p].l-l);
		t[p].D+=D;
		return ;
	}
	pushdown(p);
	re int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) modify(p<<1,l,r,K,D);
	if(r>mid) modify(p<<1|1,l,r,K,D);
}

il ll query(re int p,re int x)
{
	if(t[p].l==t[p].r&&t[p].l==x)
	{
		return t[p].K;
	}
	pushdown(p);
	re int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid) return query(p<<1,x);
	return query(p<<1|1,x); 
}

int main()
{
	scanf("%d%d",&n,&m);
	for(re int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	for(re int i=1;i<=m;i++)
	{
		re int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			re int l,r,K,D;
			scanf("%d%d%d%d",&l,&r,&K,&D);
			modify(1,l,r,K,D);
		}
		else
		{
			re int p;
			scanf("%d",&p);
			printf("%lld\n",query(1,p));
		} 
	}
	return 0;
} 

思路如果有问题请指教。

2022/12/23 10:29
加载中...