求助
查看原帖
求助
140411
yangzhiqin楼主2020/7/31 14:30
#include<cstdio>
using namespace std;
typedef long long ll;
struct node
{
	ll l,r,lc,rc,c,mul,add;
	node()
	{
		l=r=lc=rc=c=add=0;mul=1;
	}
}tr[410000];ll len=0,a[110000],p;
void bt(ll l,ll r)
{
	len++;ll now=len;
	tr[now].l=l,tr[now].r=r,tr[now].lc=tr[now].rc=-1;
	if(l==r)tr[now].c=a[l];
	else
	{
		ll mid=(l+r)/2;
		tr[now].lc=len+1;bt(l,mid);
		tr[now].rc=len+1;bt(mid+1,r);
		tr[now].c=(tr[tr[now].lc].c+tr[tr[now].rc].c)%p;
	}
}
void pushdown(ll now,ll l,ll r)
{
	ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
	tr[lc].c=(tr[lc].c*tr[now].mul%p+tr[now].add*(mid-l+1)%p)%p;
	tr[lc].mul=(tr[lc].mul*tr[now].mul)%p;
	tr[lc].add=(tr[lc].add*tr[now].mul+tr[now].add)%p;
	tr[rc].c=(tr[rc].c*tr[now].mul%p+tr[now].add*(r-mid-1+1)%p)%p;
	tr[rc].mul=(tr[rc].mul*tr[now].mul)%p;
	tr[rc].add=(tr[rc].add*tr[now].mul+tr[now].add)%p;
	tr[now].add=0;tr[now].mul=1;
	return;
}
void change_add(ll now,ll l,ll r,ll k)
{
	if(tr[now].r<l||tr[now].l>r)return;
	if(l<=tr[now].l&&tr[now].r<=r)
	{
		tr[now].c=(tr[now].c+k*(tr[now].r-tr[now].l+1)%p)%p;
		tr[now].add=(tr[now].add+k)%p;return;
	}
	pushdown(now,tr[now].l,tr[now].r);
	ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
	change_add(lc,l,mid,k);change_add(rc,mid+1,r,k);
	tr[now].c=(tr[lc].c+tr[rc].c)%p;
}
void change_mul(ll now,ll l,ll r,ll k)
{
	if(tr[now].r<l||tr[now].l>r)return;
	if(l<=tr[now].l&&tr[now].r<=r)
	{
		tr[now].c=(tr[now].c*k)%p;
		tr[now].mul=(tr[now].mul*k)%p;
		tr[now].add=(tr[now].add*k)%p;
		return;
	}
	pushdown(now,tr[now].l,tr[now].r);
	ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
	change_mul(lc,l,mid,k);change_mul(rc,mid+1,r,k);
	tr[now].c=(tr[lc].c+tr[rc].c)%p;
}
ll getsum(ll now,ll l,ll r)
{
	if(tr[now].r<l||tr[now].l>r)return 0;
	if(l<=tr[now].l&&tr[now].r<=r)return tr[now].c;
	pushdown(now,tr[now].l,tr[now].r);
	ll lc=tr[now].lc,rc=tr[now].rc,mid=(tr[now].l+tr[now].r)/2;
	return (getsum(lc,l,mid)+getsum(rc,mid+1,r))%p;
}
int main()
{
	ll n,m;scanf("%lld%lld%lld",&n,&m,&p);
	for(int i=1;i<=n*4;i++)tr[i].mul=1;
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	len=0;bt(1,n);
	for(int i=1;i<=m;i++)
	{
		ll l;scanf("%lld",&l);
		if(l==1)
		{
			ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
			change_mul(1,x,y,z);
		}else if(l==2)
		{
			ll x,y,z;scanf("%lld%lld%lld",&x,&y,&z);
			change_add(1,x,y,z);
		}else
		{
			ll x,y;scanf("%lld%lld",&x,&y);
			printf("%lld\n",getsum(1,x,y)%p);
		}
	}
	return 0;
}

样例对了,为什么交上去就是零分??求大神改正

2020/7/31 14:30
加载中...