一脸懵的萌新求助
查看原帖
一脸懵的萌新求助
295504
Into_qwq楼主2020/8/20 22:34

RT

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100001;
int n,m,p,a[N];
struct node{
	ll v,mt,at;
}tree[N*4];
inline int ls(int i){
	return i<<1;
}
inline int rs(int i){
	return i<<1|1;
}
inline void build(int i,int l,int r){
	tree[i].mt=1,tree[i].at=0;
	if(l==r){
		tree[i].v=a[l];
        tree[i].v%=p;
        return;
    }
	int mid=l+r>>1;
	build(ls(i),l,mid);
	build(rs(i),mid+1,r);
	tree[i].v=tree[ls(i)].v+tree[rs(i)].v;
	tree[i].v%=p;
}
inline void push_down(int i,int l,int r){
	int mid=l+r>>1;
	tree[ls(i)].v=(tree[ls(i)].v*tree[i].mt+tree[i].at*(mid-l+1))%p;
	tree[rs(i)].v=(tree[rs(i)].v*tree[i].mt+tree[i].at*(r-mid))%p;
	tree[ls(i)].mt=(tree[ls(i)].mt*tree[i].mt)%p; 
	tree[rs(i)].mt=(tree[rs(i)].mt*tree[i].mt)%p;
	tree[ls(i)].at=(tree[ls(i)].at*tree[i].mt+tree[i].at)%p;
	tree[rs(i)].at=(tree[rs(i)].at*tree[i].mt+tree[i].at)%p;
	tree[i].mt=1;
	tree[i].at=0;
}
inline void udml(int i,int nl,int nr,int l,int r,ll k){
	if(l>nr || r<nl) return;
	if(l<=nl && nr<=r){
		tree[i].v=(tree[i].v*k)%p;
		tree[i].mt=(tree[i].mt*k)%p;
		tree[i].at=(tree[i].at*k)%p;
        return;
	}
	push_down(i,nl,nr);
	int mid=nl+nr>>1;
	udml(ls(i),nl,mid,l,r,k);
	udml(rs(i),mid+1,nr,l,r,k);
	tree[i].v=(tree[ls(i)].v+tree[rs(i)].v)%p;
}
inline void udad(int i,int nl,int nr,int l,int r,ll k){
	if(l>nr || r<nl) return;
	if(l<=nl && nr<=r){
		tree[i].at=(tree[i].at*k)%p;
		tree[i].v=(tree[i].v+k*(nr-nl+1))%p;
        return;
	}
	push_down(i,nl,nr);
	int mid=nl+nr>>1;
	udad(ls(i),nl,mid,l,r,k);
	udad(rs(i),mid+1,nr,l,r,k);
	tree[i].v=(tree[ls(i)].v+tree[rs(i)].v)%p;
}
inline ll query(int i,int nl,int nr,int l,int r){
	if(l>nr || r<nl) return 0;
	if(l<=nl && nr<=r)
		return tree[i].v;
	push_down(i,nl,nr);
	int mid=nl+nr>>1;
	return (query(ls(i),nl,mid,l,r)+query(rs(i),mid+1,nr,l,r));
}
int main(){
	cin>>n>>m>>p;
	for(int i=1;i<=n;++i) cin>>a[i];
	build(1,1,n);
	while(m--){
		int opt,l,r,k;
		cin>>opt>>l>>r;
		if(opt==1){
			cin>>k;
			udml(1,1,n,l,r,k);
		}
		if(opt==2){
			cin>>k;
			udad(1,1,n,l,r,k);
		}
		if(opt==3){
			cout<<query(1,1,n,l,r)<<endl;
		}
	}
}

全WA,就是很迷惑(萌新见谅)

2020/8/20 22:34
加载中...