线段树过不了样例,求助各位大佬
查看原帖
线段树过不了样例,求助各位大佬
162909
鬼才权家浩666楼主2021/12/29 22:30
#include<bits/stdc++.h>
#define ls k<<1
#define rs k<<1|1
#define mid (l+r>>1)
using namespace std;
const int maxN=5e5+10;
typedef long long ll;
struct Tree{
	ll v,mul,add;
}tree[maxN<<2];
ll n,m,p;
ll read(),query(ll,ll,ll,ll,ll);
void work(),write(ll x),push_up(ll),build(ll,ll,ll),up_date(ll,ll,ll,ll,ll,ll),Up_date(ll,ll,ll,ll,ll,ll),push_down(ll,ll,ll);
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	work();
	return 0;
}
void work(){
	n=read(),m=read(),p=read();
	build(1,1,n);
	while(m--){
		ll op=read(),x=read(),y=read();
		if(op<2) Up_date(1,1,n,x,y,read());
		else if(op<3) up_date(1,1,n,x,y,read());
		else write(query(1,1,n,x,y)),puts("");
	}
}
ll read(){
	ll s=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*f;
}
void write(ll x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
void build(ll k,ll l,ll r){
	tree[k].mul=1;
	if(l==r){
		tree[k].v=read();
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	push_up(k);
}
void push_up(ll k){
	tree[k].v=(tree[ls].v+tree[rs].v)%p;
}
void up_date(ll k,ll l,ll r,ll x,ll y,ll v){
	if(y<l||x>r) return;
	if(x<=l&&y>=r){
		tree[k].add=(tree[k].add+v)%p;
		tree[k].v=(tree[k].v+v*(r-l+1))%p;
		return;
	}
	push_down(k,l,r);
	up_date(ls,l,mid,x,y,v);
	up_date(rs,mid+1,r,x,y,v);
	push_up(k);
}
void Up_date(ll k,ll l,ll r,ll x,ll y,ll v){
	if(y<l||x>r) return;
	if(x<=l&&y>=r){
		tree[k].v=(tree[k].v*v)%p;
		tree[k].mul=(tree[k].mul*v)%p;
		tree[k].add=(tree[k].add*v)%p;
		return;
	}
	push_down(k,l,r);
	Up_date(ls,l,mid,x,y,v);
	Up_date(rs,mid+1,r,x,y,v);
	push_up(k);
}
void push_down(ll k,ll l,ll r){
	tree[ls].v=(tree[ls].v*tree[k].mul+tree[k].add*(m-l+1))%p,tree[ls].mul=(tree[ls].mul*tree[k].mul)%p,tree[ls].add=(tree[ls].add*tree[k].mul+tree[k].add)%p;
	tree[rs].v=(tree[rs].v*tree[k].mul+tree[k].add*(r-mid))%p,tree[rs].mul=(tree[rs].mul*tree[k].mul)%p,tree[rs].add=(tree[rs].add*tree[k].mul+tree[k].add)%p;
	tree[k].mul=1,tree[k].add=0;
	return;
}
ll query(ll k,ll l,ll r,ll x,ll y){	
	if(y<l||x>r) return 0;
	if(x<=l&&y>=r) return tree[k].v;
	push_down(k,l,r); 
	return (query(ls,l,mid,x,y)+query(rs,mid+1,r,x,y))%p;
}
2021/12/29 22:30
加载中...