30求助
查看原帖
30求助
212320
djwj323楼主2021/7/19 15:16

wa了7个点,样例过了

#include <iostream>
#include <cstdio>
using namespace std;
long long n,m,P;
long long a[300002],ans[300002],tag1[300002],tag2[300002];
long long t,x,y,k,i;
void build(long long p,long long l,long long r)
{
    if(l==r)
	{
		ans[p]=a[l];
		return;
	}
    long long f=(l+r)/2;
    build(p*2,l,f),build(p*2+1,f+1,r);
    ans[p]=(ans[p*2]+ans[p*2+1])%P;
}
void p1(long long x,long long y,long long l,long long r,long long p)
{
	if(y<l||r<x)  return;
	if(x<=l&&r<=y)
	{
		ans[p]=(ans[p]*k)%P,tag1[p]=(tag1[p]*k)%P,tag2[p]=(tag2[p]*k)%P;
		return;
	}
	long long f=(l+r)/2;
	ans[p*2]=(ans[p*2]*tag1[p]+(f-l+1)*tag2[p])%P;
	tag1[p*2]=(tag1[p*2]*tag1[p])%P,tag2[p*2]=(tag2[p*2]*tag1[p]+tag2[p])%P;
	ans[p*2+1]=(ans[p*2+1]*tag1[p]+(r-f)*tag2[p])%P;
	tag1[p*2+1]=(tag1[p*2+1]*tag1[p])%P,tag2[p*2+1]=(tag2[p*2+1]*tag1[p]+tag2[p])%P;
	tag1[p]=1,tag2[p]=0;
	p1(x,y,l,f,p*2),p1(x,y,f+1,r,p*2+1);
	ans[p]=(ans[p*2]+ans[p*2+1])%P;
}
void p2(long long x,long long y,long long l,long long r,long long p)
{
	if(y<l||r<x)  return;
	if(x<=l&&r<=y)
	{
		ans[p]=(ans[p]+(r-l+1)*k)%P,tag2[p]=(tag2[p]+k)%P;
		return;
	}
	long long f=(l+r)/2;
	ans[p*2]=(ans[p*2]*tag1[p]+(f-l+1)*tag2[p])%P;
	tag1[p*2]=(tag1[p*2]*tag1[p])%P,tag2[p*2]=(tag2[p*2]*tag1[p]+tag2[p])%P;
	ans[p*2+1]=(ans[p*2+1]*tag1[p]+(r-f)*tag2[p])%P;
	tag1[p*2+1]=(tag1[p*2+1]*tag1[p])%P,tag2[p*2+1]=(tag2[p*2+1]*tag1[p]+tag2[p])%P;
	tag1[p]=1,tag2[p]=0;
	p2(x,y,l,f,p*2),p2(x,y,f+1,r,p*2+1);
	ans[p]=(ans[p*2]+ans[p*2+1])%P;
}
long long p3(long long x,long long y,long long l,long long r,long long p)
{
	if(y<l||r<x)  return 0;
	if(x<=l&&r<=y)  return ans[p];
	long long f=(l+r)/2,o=0;
	ans[p*2]=(ans[p*2]*tag1[p]+(f-l+1)*tag2[p])%P;
	tag1[p*2]=(tag1[p*2]*tag1[p])%P,tag2[p*2]=(tag2[p*2]*tag1[p]+tag2[p])%P;
	ans[p*2+1]=(ans[p*2+1]*tag1[p]+(r-f)*tag2[p])%P;
	tag1[p*2+1]=(tag1[p*2+1]*tag1[p])%P,tag2[p*2+1]=(tag2[p*2+1]*tag1[p]+tag2[p])%P;
	tag1[p]=1,tag2[p]=0;
	return (o+p3(x,y,f+1,r,p*2+1))%P+(o+p3(x,y,l,f,p*2))%P;
}
int main()
{
	freopen("P3373_2.in","r",stdin),freopen("a.txt","w",stdout);
    for(scanf("%lld%lld%lld",&n,&m,&P),i=1;i<=n;i++)  scanf("%lld",&a[i]),tag1[i]=1;
    for(build(1,1,n),i=1;i<=m;i++)
    {
    	scanf("%lld",&t);
    	if(t==1)  scanf("%lld%lld%lld",&x,&y,&k),p1(x,y,1,n,1);
		else if(t==2)  scanf("%lld%lld%lld",&x,&y,&k),p2(x,y,1,n,1);
    	else  scanf("%lld%lld",&x,&y),printf("%lld\n",p3(x,y,1,n,1)%P);
	}
    return 0;
}
2021/7/19 15:16
加载中...