求助,30pts
查看原帖
求助,30pts
534588
yz马孟哲楼主2021/10/4 21:51
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 9;
int data[N] , tree[N] , flag[N] , _flag[N] , mod;

//int po[N],i1;

inline int read()
{
	int x = 0, f = 1;
	char c = getchar();
	while(c > '9' || c <'0')
	{
		if(c == '-')
			f = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9')
	{
		x = x*10 + c - 48;
		c = getchar();
	}
	return x*f;
}
void build(int s , int e , int p){
	_flag[p] = 1;
	if(s == e){
		tree[p] = data[s];
//		po[++i1] = s;
		return;
	}
	int m = s + ((e - s) >> 1);
	build(s , m , p << 1);
	build(m + 1 , e , (p << 1) + 1);
	tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
	tree[p] %= mod;
}
void pushdown(int p , int s , int m , int e){
	tree[p << 1] = (tree[p << 1] * _flag[p] + flag[p] * (m - s + 1)) % mod;
	tree[(p << 1) + 1] = tree[(p << 1) + 1] * _flag[p] + flag[p] * (e - m) % mod;
	_flag[(p << 1)] *= _flag[p];
	_flag[(p << 1)] %= mod;
	_flag[(p << 1) + 1] *= _flag[p];
	_flag[(p << 1) + 1] %= mod;
//	tree[(p << 1)] += (m - s + 1) * flag[p];
//	tree[(p << 1)] %= mod;
//	tree[(p << 1) + 1] += (e - m) * flag[p];
//	tree[(p << 1) + 1] %= mod;
	flag[(p << 1)] = (flag[(p << 1)] *  _flag[p] + flag[p]) % mod;
	flag[(p << 1) + 1] = (flag[(p << 1) + 1] *  _flag[p] + flag[p]) % mod;
//	flag[(p << 1) + 1] %= mod;
	flag[p] = 0;
	_flag[p] = 1;
}
void add(int x , int y , int s , int e , int p , int k){
	if(s >= x && e <= y){
		tree[p] += (e - s + 1) * k;
		flag[p] += k;
		return;
	}
	int m = s + ((e - s) >> 1);
//	if(flag[p] && s != e){
		pushdown(p , s , m , e);
//	}
	if(m >= x)
		add(x , y , s , m , (p << 1) , k);
	if(m < y)
		add(x , y , m + 1 , e , (p << 1) + 1 , k);
	tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
	tree[p] %= mod;
}

void mul(int x , int y , int s , int e , int p , int k){
	if(s >= x && e <= y){
		flag[p] = (flag[p] * k) % mod;
		_flag[p] = (_flag[p] * k) % mod;
		tree[p] = (tree[p] * k) % mod;
		return;
	}
	int m = s + ((e - s) >> 1);
//	if(flag[p] && s != e){
		pushdown(p , s , m , e);
//	}
	if(m >= x)
		mul(x , y , s , m , (p << 1) , k);
	if(m < y)
		mul(x , y , m + 1 , e , (p << 1) + 1 , k);
	tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
	tree[p] %= mod;
}

int fin(int x , int y , int s , int e , int p){
	if(s >= x && e <= y){
		return tree[p];
	}
	int m = s + ((e - s) >> 1);
//	if(flag[p]){
		pushdown(p , m , s , e);
//	}
	int val = 0;
	if(m >= x)
		val = (val + fin(x , y , s , m , (p << 1))) % mod;
	if(m < y)
		val = (val + fin(x , y , m + 1 , e , (p << 1) + 1)) % mod;
//	tree[p] = tree[(p << 1)] + tree[(p << 1) + 1];
	return val;	
}

signed main(){
	int n , m , x , y , k , opt;
	n = read() , m = read() , mod = read();
	for(int i = 1 ; i <= n ; i ++){
		data[i] = read();
	}
	build(1 , n , 1);
	
//	for(int i = 1;i <= n;i ++){
//		cout << tree[po[i]] << endl;
//	}
	
	while(m--){
		opt = read() , x = read() , y = read();
		if(opt == 1){
			k = read();
			mul(x , y , 1 , n , 1 , k);
		}
		else if(opt == 2){
			k = read();
			add(x , y , 1 , n , 1 , k);
		}
		else{
			cout << fin(x , y , 1 , n , 1) << endl;
		}
	}
}
2021/10/4 21:51
加载中...