求调线段树全WA能过样例
查看原帖
求调线段树全WA能过样例
253936
simonG楼主2022/6/7 22:29
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const ll N=1e5+10;
ll n,m,mod,dat[4*N],a[N],taga[4*N],tagm[4*N];
void build(ll p,ll l,ll r) {
	tagm[p]=1;
	if(l==r) {
		dat[p]=a[l];
		return ;
	}
	ll mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	dat[p]=(dat[p*2]+dat[p*2+1])%mod;
}
void mul(ll p,ll l,ll r,ll v) {
	tagm[p]=tagm[p]*v%mod;
	dat[p]=dat[p]*v%mod;
}
void add(ll p,ll l,ll r,ll v) {
	taga[p]=(taga[p]+v+mod)%mod;
	dat[p]=(dat[p]+v*(r-l+1)+mod)%mod;
}
void pushdown(ll p,ll l,ll r) {
	ll mid=(l+r)/2;
	mul(p*2,l,mid,tagm[p]);
	mul(p*2+1,mid+1,r,tagm[p]);
	add(p*2,l,mid,taga[p]);
	add(p*2+1,mid+1,r,taga[p]);
	tagm[p]=1;
	taga[p]=0;
}
void modify_add(ll p,ll l,ll r,ll x,ll y,ll v) {
	if(x<=l&&r<=y) {
		add(p,l,r,v);
		return;
	}
	pushdown(p,l,r);
	ll mid=(l+r)/2;
	if(x<=mid) modify_add(p*2,l,mid,x,y,v);
	if(y>mid) modify_add(p*2+1,mid+1,r,x,y,v);
	dat[p]=(dat[p*2]+dat[p*2+1])%mod;
}
void modify_mul(ll p,ll l,ll r,ll x,ll y,ll v) {
	if(x<=l&&r<=y) {
		mul(p,l,r,v);
		return;
	}
	pushdown(p,l,r);
	ll mid=(l+r)/2;
	if(x<=mid) modify_mul(p*2,l,mid,x,y,v);
	if(y>mid) modify_mul(p*2+1,mid+1,r,x,y,v);
	dat[p]=(dat[p*2]+dat[p*2+1])%mod;
}
ll query(ll p,ll l,ll r,ll x,ll y) {
	if(x<=l&&r<=y) return dat[p]%mod;
	pushdown(p,l,r);
	ll mid=(l+r)/2;
    ll res=0;
	if(x<=mid) res+=query(p*2,l,mid,x,y);
	if(y>mid) res+=query(p*2+1,mid+1,r,x,y);
	return res%mod;
}
int main() {
	scanf("%lld %lld %lld",&n,&m,&mod);
	for(ll i=1; i<=n; i++) scanf("%lld",&a[i]);
	build(1,1,n);
	for(ll i=1,opt,x,y,v; i<=m; i++) {
		scanf("%lld %lld %lld",&opt,&x,&y);
		if(opt==1) {
			scanf("%lld",&v);
			modify_mul(1,1,n,x,y,v);
		} else if(opt==2) {
			scanf("%lld",&v);
			modify_add(1,1,n,x,y,v);
		} else {
			printf("%lld\n",query(1,1,n,x,y)%mod);
		}
	}
	return 0;
}
2022/6/7 22:29
加载中...