为什么开__in128才过
查看原帖
为什么开__in128才过
434929
Usada_Pekora楼主2021/12/8 11:09

rt,附代码。虽然已经过了但是很疑惑。

#include<bits/stdc++.h>
using namespace std;
#define int __int128
inline int read(){
	register int x=0,f=1,ch=getchar();
	while(ch<'0'||ch>'9')f=(ch=='-'?-1:1),ch=getchar();
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
inline void write(register int x){
	if(x<0)putchar('-'),x=-x;
	if(x>9)write(x/10);
	putchar(x%10+48);
}
const int N=1e5+5;
int val[N<<2],add[N<<2],mul[N<<2],a[N],n,m,mod;
#define ls (p<<1)
#define rs (p<<1|1)
inline void pushup(int p){
	val[p]=val[ls]+val[rs];
}
inline void build(int p,int l,int r){
	mul[p]=1;
	if(l==r){
		val[p]=a[l]%mod;
		return;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}
inline void func(int p,int l,int r,int _mul,int _add){
	val[p]=(val[p]*_mul%mod+(r-l+1)*_add%mod)%mod;
	mul[p]=(mul[p]*_mul)%mod;
	add[p]=(add[p]*_mul%mod+_add)%mod;
}
inline void pushdown(int p,int l,int r){
	int mid=(l+r)>>1;
	func(ls,l,mid,mul[p],add[p]);
	func(rs,mid+1,r,mul[p],add[p]);
	mul[p]=1,add[p]=0;
}
inline void Add(int p,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		val[p]=(val[p]+(r-l+1)*k%mod)%mod;
		add[p]=(add[p]+k)%mod;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(p,l,r);
	if(L<=mid)Add(ls,l,mid,L,R,k);
	if(R>mid)Add(rs,mid+1,r,L,R,k);
	pushup(p);
}
inline void Mul(int p,int l,int r,int L,int R,int k){
	if(L<=l&&r<=R){
		val[p]=(val[p]*k)%mod;
		mul[p]=(mul[p]*k)%mod;
		add[p]=(add[p]*k)%mod;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(p,l,r);
	if(L<=mid)Mul(ls,l,mid,L,R,k);
	if(R>mid)Mul(rs,mid+1,r,L,R,k);
	pushup(p);
}
inline int query(int p,int l,int r,int L,int R){
	if(L<=l&&r<=R)return val[p];
	int mid=(l+r)>>1,res=0;
	pushdown(p,l,r);
	if(L<=mid)res=(res+query(ls,l,mid,L,R))%mod;
	if(R>mid)res=(res+query(rs,mid+1,r,L,R))%mod;
	return res;
}
signed main(){
	n=read(),mod=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	m=read();
	for(int i=1,op,l,r,k;i<=m;i++){
		op=read();
		if(op==1){
			l=read(),r=read(),k=read();
			Mul(1,1,n,l,r,k);
		}
		if(op==2){
			l=read(),r=read(),k=read();
			Add(1,1,n,l,r,k);
		}
		if(op==3){
			l=read(),r=read();
			write(query(1,1,n,l,r));
			putchar('\n');
		}
	}
	return 0;
}
2021/12/8 11:09
加载中...