社区讨论
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 条回复,欢迎继续交流。
正在加载回复...