样例过了测试点全0求调
查看原帖
样例过了测试点全0求调
267812
wangjiayu19楼主2023/2/26 11:55
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
	int s = 0, f = 1;
	char c = 0;
	while(c < '0' || c > '9'){if(c == '-') f *= -1; c = getchar();}
	while(c >= '0' && c <= '9'){s = s * 10 + c - '0'; c = getchar();}
	return s * f;
}

struct _Tree{
	int l, r;
	ll add;
	ll times = 1;
	ll sum;
}tree[100010<<2];
ll init[100010];
void push_up(int rt){
	tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
}
void push_down(int rt){
	if(tree[rt].times != 1){
		tree[rt << 1].sum *= tree[rt].times;
		tree[rt << 1].times *= tree[rt].times;
		tree[rt << 1 | 1].sum *= tree[rt].times;
		tree[rt << 1 | 1].times *= tree[rt].times;
		tree[rt].times = 1;
	} 
	if(tree[rt].add != 0){
		tree[rt << 1].sum += tree[rt].add * (tree[rt << 1].r - tree[rt << 1].l + 1);
		tree[rt << 1].add += tree[rt].add;
		tree[rt << 1 | 1].sum += tree[rt].add * (tree[rt << 1 | 1].r - tree[rt << 1 | 1].l + 1);
		tree[rt << 1 | 1].add += tree[rt].add;
		tree[rt].add = 0;
	}
}
void add(int rt, int l, int r, ll a){
	if(tree[rt].l > r || tree[rt].r < l){
		return;
	}
	if(tree[rt].l >= l && tree[rt].r <= r){
		tree[rt].sum += a * (tree[rt].r - tree[rt].l + 1);
		tree[rt].add += a;
		return;
	}
	push_down(rt); 
	int mid = ((tree[rt].l + tree[rt].r) >> 1);
	add(rt << 1, l, mid, a);
	add(rt << 1 | 1, mid + 1 , r, a);
	push_up(rt);
}
void times(int rt, int l, int r, ll a){
	if(tree[rt].l > r || tree[rt].r < l){
		return;
	}
	if(tree[rt].l >= l && tree[rt].r <= r){
		tree[rt].sum *= a;
		tree[rt].times *= a;
		tree[rt].add *= a;
		return;
	}
	push_down(rt);
	int mid = ((tree[rt].l + tree[rt].r) >> 1);
	times(rt << 1, l, r, a);
    times(rt << 1 | 1, l, r, a);
	push_up(rt);
}
ll q(int rt, int l, int r){
	if(tree[rt].l > r || tree[rt].r < l){
		return 0;
	}
	if(tree[rt].l == tree[rt].r){
		return tree[rt].sum;
	}
	push_down(rt);
	return q(rt << 1, l, r) + q(rt << 1 | 1, l, r); 
}
void build(int rt, int l, int r){
	tree[rt].l = l;
	tree[rt].r = r;
	if(l == r){
		tree[rt].sum = init[l];
		return;
	}
	int mid = (l + r) / 2;
	build(rt << 1, l, mid);
	build(rt << 1 | 1, mid + 1, r);
	push_up(rt);
}
int main(){
	int n = read(), m = read(), mod = read();
	for(int i=1;i<=n;i++){
		init[i] = read();
	}
	build(1, 1, n);
	for(int i=1;i<=m;i++){
		int mode = read(), x = read(), y = read();
		if(mode == 1){
			ll a = read();
			times(1, x, y, a);
		}
		else if(mode == 2){
			ll a = read();
			add(1, x, y, a);
		}
		else if(mode == 3){
			cout<<q(1, x, y) % mod<<endl;
		}
	}
	return 0;
}
2023/2/26 11:55
加载中...