社区讨论

60pts求调

P8563 Magenta Potion参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo7vmrcv
此快照首次捕获于
2023/10/27 08:30
2 年前
此快照最后确认于
2023/10/27 08:30
2 年前
查看原帖
CPP
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

#define LL long long

using namespace std;

const int N = 2e5 + 5, M = 1073741824;
struct Node{
    int l, r;
    LL sum, tmax, lmax, rmax, lmin, rmin;
}tr[N * 4];
int a[N], n, q;

LL mu(LL &a, LL &b){
    if(a >= M && b >= M) return M + 1;
    if(a > M){
        if(b > 0) return M + 1;
        else return 1;
    }
    else if(b > M){
        if(a > 0) return M + 1;
        else return 1;
    }
    else return a * b;
}

void pushup(Node &u, Node &l, Node &r){
    u.sum = mu(l.sum, r.sum);
    u.lmax = max(l.lmax, max(mu(l.sum, r.lmax), mu(l.sum, r.lmin)));
    u.rmax = max(r.rmax, max(mu(r.sum, l.rmax), mu(r.sum, l.rmin)));
    u.lmin = min(l.lmin, min(mu(l.sum, r.lmin), mu(l.sum, r.lmax)));
    u.rmin = min(r.rmin, min(mu(r.sum, l.rmin), mu(r.sum, l.rmax)));
    u.tmax = max(max(l.tmax, r.tmax), max(mu(l.rmax, r.lmax), mu(l.rmin, r.lmin)));
}

void pushup(int u){
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}

void build(int u, int l, int r){
    if(l == r) tr[u] = {l, r, a[l], a[l], a[l], a[l], a[l], a[l]};
    else{
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

void modify(int u, int x, int v){
    if(tr[u].l == x && tr[u].r == x) tr[u] = {x, x, v, v, v, v, v, v};
    else{
        int mid = tr[u].l + tr[u].r >> 1;
        if(x <= mid) modify(u << 1, x, v);
        else modify(u << 1 | 1, x, v);
        pushup(u);
    }
}

Node query(int u, int l, int r){
    if(tr[u].l >= l && tr[u].r <= r) return tr[u];
    else{
        int mid = tr[u].l + tr[u].r >> 1;
        if(r <= mid) return query(u << 1, l, r);
        else if(l > mid) return query(u << 1 | 1, l, r);
        else{
            Node res;
            auto left = query(u << 1, l, r);
            auto right = query(u << 1 | 1, l, r);
            pushup(res, left, right);
            return res;
        }
    }
}

int main(){
    cin >> n >> q;
    for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
    build(1, 1, n);
    while(q --){
        int k, x, y;
        cin >> k >> x >> y;
        if(k == 1){
            modify(1, x, y);
        }
        else{
            auto ans = query(1, x, y);
            if(ans.tmax > M) cout << "Too large" << endl;
            else cout << (ans.tmax > 0 ? ans.tmax : 1) << endl;
        }
    }
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...