萌新求助线段树模板
查看原帖
萌新求助线段树模板
361726
追梦之鲸楼主2022/1/9 17:52
#include<bits/stdc++.h>
using namespace std;
#include<ctime>
//unordered_map
//priority_queue
/*
class fast_iostream{
private:
    const int MAXBF = 1 << 20; FILE *inf, *ouf;
    char *inbuf, *inst, *ined;
    char *oubuf, *oust, *oued;
    inline void _flush(){fwrite(oubuf, 1, oued - oust, ouf);}
    inline char _getchar(){
        if(inst == ined) inst = inbuf, ined = inbuf + fread(inbuf, 1, MAXBF, inf);
        return inst == ined ? EOF : *inst++;
    }
    inline void _putchar(char c){
        if(oued == oust + MAXBF) _flush(), oued = oubuf;
        *oued++ = c;
    }
public:
     fast_iostream(FILE *_inf = stdin, FILE * _ouf = stdout)
    :inbuf(new char[MAXBF]), inf(_inf), inst(inbuf), ined(inbuf),
     oubuf(new char[MAXBF]), ouf(_ouf), oust(oubuf), oued(oubuf){}
    ~fast_iostream(){_flush(); delete inbuf; delete oubuf;}
    template <typename Int>
    fast_iostream& operator >> (Int  &n){
        static char c;
        while((c = _getchar()) < '0' || c > '9');n = c - '0';
        while((c = _getchar()) >='0' && c <='9') n = n * 10 + c - '0';
        return *this;
    }
    template <typename Int>
    fast_iostream& operator << (Int   n){
        if(n < 0) _putchar('-'), n = -n; static char S[20]; int t = 0;
        do{S[t++] = '0' + n % 10, n /= 10;} while(n);
        for(int i = 0;i < t;++i) _putchar(S[t - i - 1]);
        return *this;
    }
    fast_iostream& operator << (char  c){_putchar(c);    return *this;}
    fast_iostream& operator << (const char *s){
        for(int i = 0;s[i];++i) _putchar(s[i]); return *this;
    }
}lly;*/
const int N=1e6+10;
const long long MAX=1e18+17;
typedef unsigned long long ull;
#define ll long long
#define ri register
#define il inline

#define lowbit(x) x&-x
#define R(x) x<<1|1
#define L(x) x<<1
#define fson 1,n,1
#define lson l,mid,L(k)
#define rson mid+1,r,R(k)

long long p;
int n,m;
int fir[N];
struct sty{
	int l,r;
	ll tag,tags;
	ll num;
	sty(){
		l=0;
		r=0;
		tag=0;
		num=0;
		tags=1;
	}
	void init(int x,int y){
		l=x;
		r=y;
		num=fir[x]%p;
		return;
	}
}xtr[5*N];
sty operator+(const sty &x,const sty &y){
	sty z;
	z.l=x.l;
	z.r=y.r;
	z.num=(x.num+y.num)%p;
	return z;
}
il void push_up(int k){
	xtr[k]=xtr[L(k)]+xtr[R(k)];
	return ;
}
il void build(int l,int r,int k){
	if(l==r){
		xtr[k].init(l,r);
		return ;
	}
	int mid=(l+r)>>1;
	build(lson);
	build(rson);
	push_up(k);
	return ;
}
il void update(int k,ll x){
	xtr[k].num+=(xtr[k].r-xtr[k].l+1)*x%p;
	xtr[k].tag+=x;
	return ;
}
il void update_(int k,ll x){
	xtr[k].num=xtr[k].num*x%p;
	xtr[k].tags*=x;
	return ;
}
il void update__(int k,ll x,ll xy){
	xtr[k].num=((xtr[k].num+(xtr[k].r-xtr[k].l+1)*x)%p+xtr[k].num*xy%p)%p;
	xtr[k].tag+=x;
	xtr[k].tags*=x;
	//printf("%d %lld %lld %lld\n",k,xtr[k].num,x,xy);
	return ;
}
il void push_down(int k){
	update__(L(k),xtr[k].tag,xtr[k].tags);
	update__(R(k),xtr[k].tag,xtr[k].tags);
	xtr[k].tag=0;
	xtr[k].tags=1;
	return ;
}
il void modify(int l,int r,int k,int ls,int rs,ll x){
	if(ls<=l and r<=rs){
		update(k,x);
		return ;
	}
	push_down(k);
	int mid=(l+r)>>1;
	if(ls<=mid){
		modify(lson,ls,rs,x);
	}
	if(mid<rs){
		modify(rson,ls,rs,x);
	}
	push_up(k);
	return ;
}
il void modify_(int l,int r,int k,int ls,int rs,ll x){
	if(ls<=l and r<=rs){
		update_(k,x);
		return ;
	}
	push_down(k);
	int mid=(l+r)>>1;
	if(ls<=mid){
		modify(lson,ls,rs,x);
	}
	if(mid<rs){
		modify(rson,ls,rs,x);
	}
	push_up(k);
	return ;
}
il sty query(int l,int r,int k,int ls,int rs){
	if(ls<=l and r<=rs){
		return xtr[k];
	}
	push_down(k);
	int mid=(l+r)>>1;
	if(ls<=mid){
		if(mid<rs){
			return query(lson,ls,rs)+query(rson,ls,rs);
		}
		else {
			return query(lson,ls,rs);
		}
	}
	else return query(rson,ls,rs);
}
signed main(){
	scanf("%d%d%lld",&n,&m,&p);
	for(int i=1;i<=n;i++){
		scanf("%d",&fir[i]);
	}
	build(fson);
	ll x,y;/*
		for(int jj=1;jj<=n<<2;jj++){
			printf("%d %d %d %lld %lld %lld\n",jj,xtr[jj].l,xtr[jj].r,xtr[jj].tag,xtr[jj].tags,xtr[jj].num);
		}cout<<endl;*/
	for(int i=1,op,l,r;i<=m;i++){
		//cout<<"!!!!\n";
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%lld",&l,&r,&x);
			modify_(fson,l,r,x);
		}else if(op==2){
			scanf("%d%d%lld",&l,&r,&x);
			modify(fson,l,r,x);
		}else{
			scanf("%d%d",&l,&r);
			printf("%lld\n",query(fson,l,r).num%p);
		}/*
		for(int jj=1;jj<=n;jj++){
			printf("%lld ",query(fson,jj,jj).num);
		}cout<<endl;
		for(int jj=1;jj<=n<<2;jj++){
			printf("%d %d %d %lld %lld %lld\n",jj,xtr[jj].l,xtr[jj].r,xtr[jj].tag,xtr[jj].tags,xtr[jj].num);
		}cout<<endl;*/
	}
	return 0;
}

找了一下午没找出来错/kk

2022/1/9 17:52
加载中...