萌新求助,居然连线段树模板都过不了
查看原帖
萌新求助,居然连线段树模板都过不了
173660
zhoukangyang楼主2020/6/6 11:07
#include<bits/stdc++.h>
#define N 110000
//#define int long long
using namespace std;
int mod;
int a[N],sum[N<<2],lazya[N<<2],lazyb[N<<2];
void build(int L,int R,int id) {
	int mid=(L+R)/2;
	lazya[id]=1;
	if(L==R) sum[id] = lazyb[id] = a[L];
	else build(L,mid,id<<1) , build(mid+1,R,id<<1|1) , sum[id] = (sum[id<<1] + sum[id<<1|1]) % mod;
}
void upd(int id,int L,int R) {
	sum[id] = ((sum[id<<1]+sum[id<<1|1])*lazya[id]+lazyb[id]*(R-L+1))%mod;
}
void pushdown(int id,int L,int R) {
	int mid=(L+R)/2;
	lazyb[id<<1] = (lazyb[id<<1]+lazyb[id]*lazya[id<<1])%mod , lazya[id<<1] = lazya[id<<1]*lazya[id]%mod;
	lazyb[id<<1|1] = (lazyb[id<<1|1]+lazyb[id]*lazya[id<<1|1])%mod , lazya[id<<1|1] = lazya[id<<1|1]*lazya[id]%mod;
	upd(id<<1,L,mid),upd(id<<1|1,mid+1,R),lazya[id]=1,lazyb[id]=0;
}
int xga(int l,int r,int L,int R,int id,int buff) {
	//printf("l=%d,r=%d,L=%d,R=%d,id=%d\n",l,r,L,R,id);
	int mid=(L+R)/2;
	if(L==l&&R==r) lazya[id] = lazya[id] * buff % mod , lazyb[id] = lazyb[id] * buff % mod;
	else if(r<=mid) pushdown(id,L,R),xga(l,r,L,mid,id<<1,buff);
	else if(l> mid) pushdown(id,L,R),xga(l,r,mid+1,R,id<<1|1,buff);
	else pushdown(id,L,R),xga(l,mid,L,mid,id<<1,buff),xga(mid+1,r,mid+1,R,id<<1|1,buff);
	upd(id,L,R);
}
int xgb(int l,int r,int L,int R,int id,int buff) {
	int mid = (L+R)/2;
	if(L==l&&R==r) lazyb[id] = (lazyb[id] + buff) % mod;
	else if(r<=mid) pushdown(id,L,R),xgb(l,r,L,mid,id<<1,buff);
	else if(l> mid) pushdown(id,L,R),xgb(l,r,mid+1,R,id<<1|1,buff);
	else pushdown(id,L,R),xgb(l,mid,L,mid,id<<1,buff),xgb(mid+1,r,mid+1,R,id<<1|1,buff);
	upd(id,L,R);
}
int query(int l,int r,int L,int R,int id) {
	int mid = (L+R)/2;
	if(L==l&&R==r) return sum[id];
	pushdown(id,L,R);
	if(r<=mid) return query(l,r,L,mid,id<<1);
	else if(l> mid) return query(l,r,mid+1,R,id<<1|1);
	else return (query(l,mid,L,mid,id<<1)+query(mid+1,r,mid+1,R,id<<1|1))%mod;
}
int n,m,xx,yy,buf,opt;
signed main() {
	scanf("%d%d",&n,&mod);
	for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
	build(1,n,1);
	scanf("%d",&m);
	while(m--) {
		scanf("%d%d%d",&opt,&xx,&yy);
		if(opt==1) scanf("%d",&buf),xga(xx,yy,1,n,1,buf);
		if(opt==2) scanf("%d",&buf),xgb(xx,yy,1,n,1,buf);
		if(opt==3) printf("%d\n",query(xx,yy,1,n,1));
//		if(opt-3) {
//			for(int i = 1; i <= n; i++) printf("%d ",query(i,i,1,n,1));
//			printf("\n");
//		}
	}
	return 0;
}
2020/6/6 11:07
加载中...