萌新刚学OI,模板代码求调awa
  • 板块学术版
  • 楼主夜阑
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/18 10:43
  • 上次更新2023/10/27 14:49:35
查看原帖
萌新刚学OI,模板代码求调awa
243263
夜阑楼主2022/8/18 10:43

P3373 【模板】线段树 2

样例没过,一直输出0 awa

#include<bits/stdc++.h>
using namespace std;
int n,m,p,w[100010],tree[100010*4],lazy[100010*4],tag[100010*4];
void build(int k,int l,int r){
	tag[k]=1;
	if(l==r){tree[k]=w[l];return ;}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	tree[k]=((tree[k*2])%p+(tree[k*2+1])%p)%p; 
}
void addp(int k,int l,int r,int w,int v){
	tree[k]=((tree[k]*w)%p+((r-l+1)*v)%p)%p;
	lazy[k]=(lazy[k]*w+v)%p;
	tag[k]=(tag[k]*w)%p;	
}
void pushdown(int k,int l,int r){
	int mid=(l+r)/2;
	addp(k*2,l,mid,tag[k],lazy[k]);
	addp(k*2+1,mid+1,r,tag[k],lazy[k]);
	lazy[k]=0;tag[k]=1;
}
void uptag(int k,int l,int r,int x,int y,int w){
	if(l>y||r<x)return;
	if(x<=l&&r<=y){
		tree[k]=(tree[k]*w)%p;
		lazy[k]=(tree[k]*w)%p;
		tag[k]=(tag[k]*w)%p;
		return ;
	}
	pushdown(k,l,r);
	int mid=(l+r)/2;
	uptag(k*2,l,mid,x,y,w);
	uptag(k*2+1,mid+1,r,x,y,w);
	tree[k]=((tree[k*2])%p+(tree[k*2+1])%p)%p;
}
void uplazy(int k,int l,int r,int x,int y,int w){
	if(l>y||r<x)return ;
	if(x<=l&&r<=y){
		tree[k]=(tree[k]+(r-l+1)*w)%p;
		lazy[k]=(lazy[k]+x)%p;
		return ;
	}
	pushdown(k,l,r);
	int mid=(l+r)/2;
	uplazy(k*2,l,mid,x,y,w);
	uplazy(k*2+1,mid+1,r,x,y,w);
	tree[k]=((tree[k*2])%p+(tree[k*2+1])%p)%p;
}
int query(int k,int l,int r,int x,int y){
	if(l>y||r>x)return 0;
	if(x<=l&&r<=y)return tree[k];
	int mid=(l+r)/2;
	return (query(k*2,l,mid,x,y)%p+query(k*2+1,mid+1,r,x,y)%p)%p;
}
int main(){
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)cin>>w[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt,x,y,k;
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>k;
			uptag(1,1,n,x,y,k);
		}
		else if(opt==2){
			cin>>k;
			uplazy(1,1,n,x,y,k);
		}
		else if(opt==3){
			cout<<query(1,1,n,x,y)<<endl;
		}
	} 
	return 0;
}
2022/8/18 10:43
加载中...