求助60pts
查看原帖
求助60pts
1313003
hwc2011楼主2024/8/15 12:20
#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define lt (root<<1)
#define rt (root<<1|1)
using namespace std;
const int N=1e5+6;
int n,q,mod,a[N];
struct Node{
	int sum,add,mul,l,r;
}tree[N<<2];
inline int read(){
	int sum=0,d=1;
	char c=getchar();
	for(;!isdigit(c);c=getchar()) d=c=='-'?-d:d;
	for(;isdigit(c);c=getchar()) sum=(sum<<3)+(sum<<1)+(c&15);
	return sum*d;
} 
void print(int x,int c){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x/10) print(x/10,2);
	putchar(x%10^48);
	if(c^2) putchar(c?'\n':' ');
}
void pushup(int root){
	tree[root].sum=tree[lt].sum+tree[rt].sum;
}
void pushdown(int root){
	tree[lt].sum=(tree[root].mul*tree[lt].sum%mod+(tree[lt].r-tree[lt].l+1)*tree[root].add%mod)%mod;
	tree[rt].sum=(tree[root].mul*tree[rt].sum%mod+(tree[rt].r-tree[rt].l+1)*tree[root].add%mod)%mod;
	tree[lt].mul=(tree[lt].mul*tree[root].mul)%mod;
	tree[rt].mul=(tree[rt].mul*tree[root].mul)%mod;
	tree[lt].add=(tree[lt].add*tree[root].mul%mod+tree[root].add)%mod;
	tree[rt].add=(tree[rt].add*tree[root].mul%mod+tree[root].add)%mod;
	tree[root].add=0;
	tree[root].mul=1;
}
void build(int root,int l,int r){
	tree[root]={a[l]%mod,0,1,l,r};
	if(l==r) return;
	build(lt,l,mid);
	build(rt,mid+1,r);
	pushup(root);
}
void update_add(int root,int l,int r,int ql,int qr,int add){
	if(l>=ql&&r<=qr){
		tree[root].add=(tree[root].add+add)%mod;
		tree[root].sum=(tree[root].sum+add*(r-l+1))%mod;
		return;
	}
	pushdown(root);
	if(ql<=mid) update_add(lt,l,mid,ql,qr,add);
	if(qr>mid) update_add(rt,mid+1,r,ql,qr,add);
	pushup(root);
}
void update_mul(int root,int l,int r,int ql,int qr,int mul){
	if(l>=ql&&r<=qr){
		tree[root].add=(tree[root].add*mul)%mod;
		tree[root].mul=(tree[root].mul*mul)%mod; 
		tree[root].sum=(tree[root].sum*mul)%mod;
		return;
	}
	pushdown(root);
	if(ql<=mid) update_mul(lt,l,mid,ql,qr,mul);
	if(qr>mid) update_mul(rt,mid+1,r,ql,qr,mul);
	pushup(root);
}
int query_sum(int root,int l,int r,int ql,int qr){
	if(l>=ql&&r<=qr) return tree[root].sum;
	pushdown(root);
	int res=0;
	if(ql<=mid) res=(res+query_sum(lt,l,mid,ql,qr))%mod;
	if(qr>mid) res=(res+query_sum(rt,mid+1,r,ql,qr))%mod;
	return res;
}
signed main(){
	n=read();
	mod=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	q=read();
	while(q--){
		int op,x,y,k;
		op=read();
		x=read();
		y=read();
		if(op^3){
			k=read();
			if(op^2) update_mul(1,1,n,x,y,k);
			else update_add(1,1,n,x,y,k);
		}
		else print(query_sum(1,1,n,x,y),1);
	}
}

P3373复制过来的,改了下输入,60分

2024/8/15 12:20
加载中...