线段树,一直CE
查看原帖
线段树,一直CE
482728
Engulf楼主2023/3/13 13:52

虽然这个写假了,但为什么它一直CE

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
typedef pair<int, int> PII;

const int inf = 0x3f3f3f3f;
const LL infLL = 0x3f3f3f3f3f3f3f3fLL;

const int N = 2e5 + 5;

int n, q, a[N];

struct Node {
	LL mul = 1, lmax = 1, rmax = 1, val = 1;
}tr[N << 2];

Node merge(const Node &a, const Node &b) {
	Node c;
	c.mul = a.mul * b.mul;
	c.val = max({a.rmax * b.lmax, a.val, b.val});
	c.lmax = max(a.lmax, a.mul * b.lmax);
	c.rmax = max(b.rmax, b.mul * a.rmax);
	return c;
}

void build(int p, int l, int r) {
	if (l == r) {
		tr[p].lmax = tr[p].rmax = tr[p].mul = tr[p].val = a[l];
		return;
	}
	int mid = l + r >> 1;
	build(p << 1, l, mid);
	build(p << 1 | 1, mid + 1, r);
	tr[p] = merge(tr[p << 1], tr[p << 1 | 1]);
}

void modify(int p, int l, int r, int x, int k) {
	if (l == r) {
		tr[p].lmax = tr[p].rmax = tr[p].mul = tr[p].val = k;
		return;
	}
	int mid = l + r >> 1;
	if (x <= mid) modify(p << 1, l, mid, x, k);
	else modify(p << 1 | 1, mid + 1, r, x, k);
	tr[p] = merge(tr[p << 1], tr[p << 1 | 1]);
}

Node query(int p, int l, int r, int L, int R) {
	if (L <= l && r <= R) return tr[p];
	int mid = l + r >> 1;
	Node a, b;
	if (L <= mid) a = query(p << 1, l, mid, L, R);
	if (mid < R) b = query(p << 1 | 1, mid + 1, r, L, R);
	return merge(a, b);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];
    build(1, 1, n);
    while (q--) {
    	int opt, l, r;
    	cin >> opt >> l >> r;
    	if (opt == 1) modify(1, 1, n, l, r);
    	else {
    		LL ans = query(1, 1, n, l, r).val;
    		if (ans > (1 << 30)) cout << "Too large\n";
    		else cout << ans << "\n";
		}
	}
    return 0;
}
2023/3/13 13:52
加载中...