样例为什么过不了,求调,玄关!!!
查看原帖
样例为什么过不了,求调,玄关!!!
952747
tankewei911楼主2024/10/24 19:51
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int MAXX = 8e5 + 5;

int n, q, x, y, k, t[MAXX], a[MAXX], op, lazy[MAXX], sum[MAXX], c[MAXX], M;

void update(int st){
	t[st] = t[st * 2] + t[st * 2 + 1];
}

void pushdown(int st){
//	cout << c[st] << " " << c[st * 2] << " " << c[st * 2 + 1] << '\n';
	t[st * 2] = (t[st * 2] * c[st] + sum[st * 2] * lazy[st]) % M;
	t[st * 2 + 1] = (t[st * 2 + 1] * c[st] + sum[st * 2 + 1] * lazy[st]) % M;
	c[st * 2] = c[st * 2] * c[st];
	c[st * 2 + 1] = c[st * 2 + 1] * c[st];
	lazy[st * 2] = (lazy[st * 2] * c[st] % M + lazy[st]) % M;
	lazy[st * 2 + 1] = (lazy[st * 2 + 1] * c[st] % M + lazy[st]) % M;
	lazy[st] = 0;
	c[st] = 1;
}

void build(int l, int r, int st){
	sum[st] = r - l + 1;
	if(l == r){
		t[st] = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(l, mid, st * 2);
	build(mid + 1, r, st * 2 + 1);
	update(st);
}

void add(int L, int R, int l, int r, int s, int st){
	if(l >= L && r <= R){
		t[st] = (t[st] + sum[st] * s) % M;
		lazy[st] = (lazy[st] + s) % M;
		return;
	}
	pushdown(st);
	int mid = (l + r) / 2;
	if(L <= mid){
		add(L, R, l, mid, s, st * 2);
	}
	if(R > mid){
		add(L, R, mid + 1, r, s, st * 2 + 1);
	}
	update(st);
}

void cheng(int L, int R, int l, int r, int s, int st){
	if(l >= L && r <= R){
		t[st] = t[st] * s % M;
		c[st] = c[st] * s % M;
		lazy[st] = lazy[st] * s % M;
		return;
	}
	pushdown(st);
	int mid = (l + r) / 2;
	if(L <= mid){
		add(L, R, l, mid, s, st * 2);
	}
	if(R > mid){
		add(L, R, mid + 1, r, s, st * 2 + 1);
	}
	update(st);
}

int answer(int L, int R, int l, int r, int st){
	if(l >= L && r <= R){
		return t[st] % M;
	}
	pushdown(st);
	int mid = (l + r) / 2, sum = 0;
	if(L <= mid){
		sum += answer(L, R, l, mid, st * 2);
	}
	if(R > mid){
		sum += answer(L, R, mid + 1, r, st * 2 + 1);		
	}
	return sum % M;
}

signed main(){
	cin >> n >> q >> M;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	for(int i = 1; i <= n * 4; i++){
		c[i] = 1;
	}
	build(1, n, 1);
//	for(int i = 1; i <= 4 * n; i++){
//		cout << t[i] << " ";
//	}
//	cout << '\n';
	while(q--){
		cin >> op;
		if(op == 1){
			cin >> x >> y >> k;
			cheng(x, y, 1, n, k, 1);
		}else if(op == 2){
			cin >> x >> y >> k;
			add(x, y, 1, n, k, 1);
		}else{
			cin >> x >> y;
			cout << answer(x, y, 1, n, 1) << '\n';
		}
//		for(int i = 1; i <= 4 * n; i++){
//			cout << t[i] << " " << c[i] << " " << lazy[i] << '\n';
//		}
//		cout << '\n';
	}
	
	
	return 0;
} 
2024/10/24 19:51
加载中...