MnZn小清新码风求调/kel
查看原帖
MnZn小清新码风求调/kel
1248522
mlvx楼主2024/7/10 18:34

WA on #5

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pl (p<<1)
#define pr (p<<1|1)
const int N=2e5+10,mod=998244353;
int n,q,a[N],b[N],sumab[N<<2],suma[N<<2],sumb[N<<2],adda[N<<2],addb[N<<2];
void push_down(int p,int l,int mid,int r){
    (sumab[pl]+=(1ll*sumb[pl]*adda[p]%mod+1ll*suma[pl]*addb[p]%mod)%mod)%=mod,(sumab[pr]+=(1ll*sumb[pr]*adda[p]%mod+1ll*suma[pr]*addb[p]%mod)%mod)%=mod;
    (suma[pl]+=1ll*adda[p]*(mid-l+1))%=mod,(suma[pr]+=1ll*adda[p]*(r-mid))%=mod,(sumb[pl]+=1ll*addb[p]*(mid-l+1))%=mod,(sumb[pr]+=1ll*addb[p]*(r-mid))%=mod;
    (adda[pl]+=adda[p])%=mod,(adda[pr]+=adda[p])%=mod,(addb[pl]+=addb[p])%=mod,(addb[pr]+=addb[p])%=mod,adda[p]=0,addb[p]=0;
}void push_up(int p){sumab[p]=(sumab[pl]+sumab[pr])%mod,suma[p]=(suma[pl]+suma[pr])%mod,sumb[p]=(sumb[pl]+sumb[pr])%mod;}
void updatea(int l,int r,int le,int ri,int v,int p){
	if(l>=le&&r<=ri)return (sumab[p]+=1ll*v*sumb[p]%mod)%=mod,(suma[p]+=1ll*v*(r-l+1)%mod)%=mod,(adda[p]+=v)%=mod,void();
	int mid=l+r>>1;push_down(p,l,mid,r);
	if(le<=mid)updatea(l,mid,le,ri,v,pl);
	if(ri>mid)updatea(mid+1,r,le,ri,v,pr);
	push_up(p);
}void updateb(int l,int r,int le,int ri,int v,int p){
	if(l>=le&&r<=ri)return (sumab[p]+=1ll*v*suma[p]%mod)%=mod,(sumb[p]+=1ll*v*(r-l+1)%mod)%=mod,(addb[p]+=v)%=mod,void();
	int mid=l+r>>1;push_down(p,l,mid,r);
	if(le<=mid)updateb(l,mid,le,ri,v,pl);
	if(ri>mid)updateb(mid+1,r,le,ri,v,pr);
	push_up(p);
}int query(int l,int r,int le,int ri,int p){
	if(l>=le&&r<=ri)return sumab[p];
	int mid=l+r>>1,ret=0;push_down(p,l,mid,r);
	if(le<=mid)(ret+=query(l,mid,le,ri,pl))%=mod;
	if(ri>mid)(ret+=query(mid+1,r,le,ri,pr))%=mod;
	return push_up(p),ret;
}void build(int l,int r,int p){
	if(l==r)return sumab[p]=1ll*a[l]*b[l]%mod,suma[p]=a[l]%mod,sumb[p]=b[l]%mod,void();
	int mid=l+r>>1;
	build(l,mid,pl),build(mid+1,r,pr),push_up(p);
}/*int */main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	build(1,n,1);
	for(int op,l,r,v;q--;){
		cin>>op>>l>>r;
		if(op==1)cin>>v,updatea(1,n,l,r,v%mod,1);
		if(op==2)cin>>v,updateb(1,n,l,r,v%mod,1);
		if(op==3)cout<<query(1,n,l,r,1)<<'\n';
	}return 0;
}
2024/7/10 18:34
加载中...