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 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int maxn = 1e5 + 10; const int lim = 30;
int n, q, res[maxn]; int mx[maxn << 2][lim];
inline int read() { int x(0), t(1); char o (getchar()); while (o < '0' || o > '9') o = getchar(); for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x; }
inline void merge(int *l, int *r) { int i(0), j(0); int tmpa[lim], tmpb[lim]; memcpy (tmpa, l, sizeof tmpa); memcpy (tmpb, r, sizeof tmpb);
while (i + j < lim) { if ((tmpa[i] == -1) && (tmpb[j] == -1)) break; if (tmpa[i] > tmpb[j]) l[i + j] = tmpa[i], i++; else l[i + j] = tmpb[j], j++; } }
void build(int l, int r, int x = 1) { if (l == r) { for (int i(1); i < lim; ++i) mx[x][i] = -1; mx[x][0] = read(); return ; } int mid = (l + r) >> 1; build (l, mid, x << 1); build (mid + 1, r, x << 1 | 1); memcpy (mx[x], mx[x << 1], sizeof mx[x]); merge (mx[x], mx[x << 1 | 1]); }
void update(int l, int r, int pos, int val, int x = 1) { if (l == r) { mx[x][0] = val; return ; }
int mid = (l + r) >> 1;
if (pos <= mid) update (l, mid, pos, val, x << 1); else update (mid + 1, r, pos, val, x << 1 | 1); memcpy (mx[x], mx[x << 1], sizeof mx[x]); merge (mx[x], mx[x << 1 | 1]); }
void getans(int l, int r, int tl, int tr, int x = 1) { if (l >= tl && r <= tr) { merge(res, mx[x]); return ; }
int mid = (l + r) >> 1;
if (tl <= mid) getans (l, mid, tl, tr, x << 1); if (tr > mid) getans (mid + 1, r, tl, tr, x << 1 | 1); }
int main() { freopen ("triangle.in", "r", stdin); freopen ("triangle.out", "w", stdout); int n = read(), q = read(), opt, l, r; build (1, n); while (q--) { opt = read(), l = read(), r = read(); if (opt == 1) update(1, n, l, r); else { for (int i = 0; i < lim; ++i) res[i] = -1; getans(1, n, l, r); ll result(0); for (int i = 0; i + 2 < lim; ++i) { if (res[i] == -1) break; if (res[i] < res[i + 1] + res[i + 2]) { result = (ll)res[i] + res[i + 1] + res[i + 2]; break; } } printf ("%lld\n", result); } } }
|