1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #include <bits/stdc++.h> using namespace std;
#define int long long const int N = 2e5 + 10;
struct Node { int sum, maxf; }; Node tr[N<<2];
int a[N]; int n, m; Node merge(Node l, Node r){ return {l.sum + r.sum, max(0LL, max(l.maxf, l.sum + r.maxf))}; }
void build(int p = 1, int l = 1, int r = n){ if(l == r){ tr[p].sum = a[l]; tr[p].maxf = max(0LL, 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 update(int l, int r, int d, int p = 1,int cl = 1 ,int cr = n) { if(l <= cl && r >= cr) { tr[p].sum = d; tr[p].maxf = max(0LL, d); return; } int mid = (cl + cr) >> 1; if(l <= mid) update(l, r, d, p<<1, cl, mid); if(r > mid) update(l, r, d, p<<1|1, mid+1, cr); tr[p] = merge(tr[p<<1], tr[p<<1|1]); }
Node query(int l, int r, int p = 1, int cl = 1, int cr = n) { if(l <= cl && r >= cr) { return tr[p]; } int mid = (cl + cr) >> 1; if(r <= mid) return query(l, r, p<<1, cl, mid); if(l > mid) return query(l, r, p<<1|1, mid+1, cr); return merge(query(l, r, p<<1, cl, mid), query(l, r, p<<1|1, mid+1, cr)); }
signed main() { ios::sync_with_stdio(0);cin.tie(0); cin >> n >> m; for(int i = 1;i <= n; ++i) { cin >> a[i]; } build();
for(int i = 1;i <= m; ++i) { int o, x, y; cin >> o >> x >> y; if(o == 1) { update(x, x, y); }else { cout << query(x, y).maxf << endl; } } }
|