样例不过求调
查看原帖
样例不过求调
933802
ICU152_lowa_IS8楼主2023/12/29 21:00

RT,实在是找不出来了(悲

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct tree{
	int val,mul,add;
}tree[400005];
int a[100005],n,q,m;
inline int ls(int p){
	return p<<1;
}
inline int rs(int p){
	return p<<1|1;
}
inline void pushup(int p){
	tree[p].val=tree[ls(p)].val+tree[rs(p)].val;
}
inline void pushdown(int l,int r,int p){
	int mid=l+r>>1;
	tree[ls(p)].val*=tree[p].mul;
	tree[ls(p)].val+=tree[p].add*(mid-l+1);
	tree[ls(p)].add*=tree[p].mul;
	tree[ls(p)].mul*=tree[p].mul;
	tree[ls(p)].add+=tree[p].add;
	tree[ls(p)].val%=m;
	tree[ls(p)].add%=m;
	tree[ls(p)].mul%=m;
	tree[rs(p)].val*=tree[p].mul;
	tree[rs(p)].val+=tree[p].add*(r-mid);
	tree[rs(p)].add*=tree[p].mul;
	tree[rs(p)].mul*=tree[p].mul;
	tree[rs(p)].add+=tree[p].add;
	tree[rs(p)].val%=m;
	tree[rs(p)].add%=m;
	tree[rs(p)].mul%=m;
	tree[p].add=0;
	tree[p].mul=1;
}
inline void build(int l,int r,int p){
	tree[p].mul=1;
	tree[p].add=0;
	if(l==r){
		tree[p].val=a[l];
		return;
	}
	int mid=l+r>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	pushup(p);
}
inline void update1(int l,int r,int ql,int qr,int p,int k){
	if(l>qr||r<ql){
		return;
	}
	if(qr>=r&&ql<=l){
		tree[p].val*=k;
		tree[p].val%=k;
		tree[p].add*=k;
		tree[p].add%=k;
		tree[p].mul*=k;
		tree[p].mul%=k;
		return;
	}
	int mid=l+r>>1;
	pushdown(l,r,p);
	update1(l,mid,ql,qr,ls(p),k);
	update1(mid+1,r,ql,qr,rs(p),k);
	pushup(p);
}
inline void update2(int l,int r,int ql,int qr,int p,int k){
	if(l>qr||r<ql){
		return;
	}
	if(qr>=r&&ql<=l){
		tree[p].val+=k*(r-l+1);
		tree[p].add+=k;
		tree[p].val%=m;
		tree[p].add%=m;
		return;
	}
	int mid=l+r>>1;
	pushdown(l,r,p);
	update2(l,mid,ql,qr,ls(p),k);
	update2(mid+1,r,ql,qr,rs(p),k);
	pushup(p);
}
inline int query(int l,int r,int ql,int qr,int p){
	if(l>qr||r<ql)return 0;
	if(qr>=r&&ql<=l){
		return tree[p].val;
	}
	if(l==r)return tree[p].val;
	pushdown(l,r,p);
	int mid=l+r>>1;
	return query(l,mid,ql,qr,ls(p))+query(mid+1,r,ql,qr,rs(p));
}

signed main(){
	cin>>n>>q>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	while(q--){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			update1(1,n,x,y,1,k);
		}
		else if(op==2){
			int x,y,k;
			cin>>x>>y>>k;
			update2(1,n,x,y,1,k);
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<query(1,n,x,y,1)%m<<endl;
		}
	}
	return 0;
}

2023/12/29 21:00
加载中...