样例过了但WA求调QAQ
查看原帖
样例过了但WA求调QAQ
1109463
godess楼主2024/12/11 17:46
#include <bits/stdc++.h>
#define fo(x,a,b) for(register int (x)=(a);(x)<=(b);++(x))
#define lc p<<1
#define rc p<<1|1
#define int long long
using namespace std;
const int M=1e5+3,mod=571373;
struct node{
	int l,r,v,add,mult;
}t[4*M];
int a[M],q,x,y,k;
void build(int l,int r,int p){
	t[p]={l,r,a[l]};
	if(l==r) return;
	int m=l+r>>1;
	build(l,m,lc);
	build(m+1,r,rc);
	t[p].v=(t[lc].v+t[rc].v)%mod;
}
void pushdown(int p){
	if(t[p].add){
		t[lc].v+=(t[p].add*(t[lc].r-t[lc].l+1))%mod;
		t[rc].v+=(t[p].add*(t[rc].r-t[rc].l+1))%mod;
		t[lc].add+=t[p].add;
		t[rc].add+=t[p].add;
		t[p].add=0;
	}
	if(t[p].mult){
		t[lc].v=(t[p].mult*t[lc].v)%mod;
		t[rc].v=(t[p].mult*t[rc].v)%mod;
		t[lc].mult+=t[p].mult;
		t[rc].mult+=t[p].mult;
		t[p].mult=0;
	}
}
int query(int l,int r,int p){
	if(t[p].l>=l&&t[p].r<=r)return t[p].v;
	int ans=0;
	pushdown(p);
	int m=t[p].l+t[p].r>>1;
	if(m>=l) ans+=query(l,r,lc);
	if(m<r) ans+=query(l,r,rc);
	return ans%mod;
} 
void update_mult(int l,int r,int p,int k){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].v=(k*t[p].v)%mod;	
		t[p].mult+=k;
		return;
	}
	int m=t[p].l+t[p].r>>1;
	pushdown(p);
	if(m>=l) update_mult(l,r,lc,k);
	if(m<r) update_mult(l,r,rc,k);
	t[p].v=(t[lc].v+t[rc].v)%mod;
}
void update_add(int l,int r,int p,int k){
	if(t[p].l>=l&&t[p].r<=r){
		t[p].v+=(k*(t[p].r-t[p].l+1))%mod;
		t[p].add+=k;
		return;
	}
	int m=t[p].l+t[p].r>>1;
	pushdown(p);
	if(m>=l) update_add(l,r,lc,k);
	if(m<r) update_add(l,r,rc,k);
	t[p].v=(t[lc].v+t[rc].v)%mod;
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m,b;
	cin>>n>>m>>b;
	fo(i,1,n)cin>>a[i];
	build(1,n,1);
	fo(i,1,m){
		cin>>q;
		if(q==1){
			cin>>x>>y>>k;
			update_mult(x,y,1,k);
		}else if(q==2){
			cin>>x>>y>>k;
			update_add(x,y,1,k);
		}else{
			cin>>x>>y;
			cout<<query(x,y,1)<<"\n";
		}
	}
	return 0;
}

2024/12/11 17:46
加载中...