满江红求调(在线等急,悬赏一关)
查看原帖
满江红求调(在线等急,悬赏一关)
699271
gaojizhe05楼主2024/5/12 21:39

只过样例,提交0pts。

送调出的大佬一个关注

code:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+7;
int n,q,m,w,x,y,z,a[maxn];
ll ans[maxn<<2],tag[maxn<<2][2];
inline int ls(int p) {return p<<1;}
inline int rs(int p) {return p<<1|1;}
inline void push_up(int p){
	ans[p]=ans[ls(p)]+ans[rs(p)];
	ans[p]%=m;
}
inline void f(int p,int l,int r,int k0,int k1){
	tag[p][0]*=k0;
	ans[p]*=k0%m;
	tag[p][1]+=k1;
	ans[p]+=(r-l+1)*k1;
	ans[p]%=m;
}
inline void push_down(int p,int l,int r){
	int mid=(l+r)>>1;
	f(ls(p),l,mid,tag[p][0],tag[p][1]);
	f(rs(p),mid+1,r,tag[p][0],tag[p][1]);
	tag[p][0]=1;
	tag[p][1]=0;
}
inline void build(int p,int l,int r){
	if(l==r){
		ans[p]=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p); 
}
inline void update(int nl,int nr,int l,int r,int p,int k0,int k1){
	if(nl<=l&&r<=nr){
		ans[p]*=k0;
		ans[p]+=(r-l+1)*k1;
		tag[p][0]*=k0;
		tag[p][1]+=k1;
		ans[p]%=m;
		return;
	}
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(nl<=mid) update(nl,nr,l,mid,ls(p),k0,k1);
	if(nr>mid) update(nl,nr,mid+1,r,rs(p),k0,k1);
	push_up(p);
}
inline ll query(int ql,int qr,int l,int r,int p){
	if(ql<=l&&r<=qr) return ans[p];
	ll res=0;
	push_down(p,l,r);
	int mid=(l+r)>>1;
	if(ql<=mid) res+=query(ql,qr,l,mid,ls(p));
	if(qr>mid) res+=query(ql,qr,mid+1,r,rs(p));
	return res%m;
}
int main(){
	scanf("%d%d%d",&n,&q,&m);
	for(int i=1;i<=n<<2;i++) tag[i][0]=1;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	while(q--){
		scanf("%d%d%d",&w,&x,&y);
		switch(w){
			case 1: scanf("%d",&z); update(x,y,1,n,1,z,0); break;
			case 2: scanf("%d",&z); update(x,y,1,n,1,1,z); break;
			case 3: printf("%lld\n",query(x,y,1,n,1)); break;
		}
	}
	return 0;
}
2024/5/12 21:39
加载中...