线段树WA求调
查看原帖
线段树WA求调
373554
King_xjl楼主2023/11/7 20:07
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 1e5 + 10;
LL n, m, a[N];
LL read() {
    register LL x = 0, f = 1; register char ch;
    ch = getchar();
    while(ch > '9' || ch < '0'){if(ch == '-') f = -f; ch = getchar();}
    while(ch <= '9' && ch >= '0'){x = x * 10 + ch - 48; ch = getchar();}
    return x * f;
}
struct Node{
	LL l, r;
	LL sum, maxx;
}tr[4 * N];
void pushup(LL u) {
	tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
	tr[u].maxx = max(tr[u << 1].maxx, tr[u << 1 | 1].maxx); 
}
void build(LL u, LL l, LL r) {
	if(l == r) tr[u] = {l, r, a[l], a[l]};
	else {
		tr[u] = {l, r};
		LL mid = l + r >> 1;
		build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
		pushup(u);
	}
}
void modify(LL u, LL k, LL x) {
	if(tr[u].l == k && tr[u].r == k) tr[u].sum = tr[u].maxx = x;
	else {
		LL mid = tr[u].l + tr[u].r >> 1;
		if(k <= mid) modify(u << 1, k, x);
		else modify(u << 1 | 1, k, x);
		pushup(u);
	}
}
void Mod(LL u, LL l, LL r, LL x) {
	if(tr[u].l >= l && tr[u].r <= r && tr[u].maxx < x) {
		return;
	}
	if(tr[u].l >= l && tr[u].r <= r && tr[u].l == tr[u].r) {
		tr[u].maxx %= x;
		tr[u].sum %= x;
		return;
	}
	LL mid = tr[u].l + tr[u].r >> 1;
	if(l <= mid) Mod(u << 1, l, r, x);
	if(r > mid) Mod(u << 1 | 1, l, r, x);
	pushup(u);
}
LL query(LL u, LL l, LL r) {
	if(tr[u].l >= l && tr[u].r <= r) return tr[u].sum;
	else {
		LL mid = tr[u].l + tr[u].r >> 1;
		LL sum = 0;
		if(l <= mid) sum = query(u << 1, l, r);
		if(r > mid) sum += query(u << 1 | 1, l, r);
		return sum;
	}
}
int main() {
	n = read(); m = read();
	for(LL i = 1; i <= n; i++) a[i] = read();
	build(1, 1, n);
	while(m--) {
		LL op;
		op = read();
		if(op == 1) {
			LL l, r;
			l = read(); r = read();
			printf("%d\n", query(1, l, r));
		} else if(op == 2) {
			LL l, r, x;
			l = read(); r = read(); x = read();
			Mod(1, l, r, x);
		} else {
			LL k, x;
			k = read(); x = read();
			modify(1, k, x);
		}
	}
	return 0;
}

评测记录

2023/11/7 20:07
加载中...