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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
| #include <bits/stdc++.h> #define ld double #define ull unsigned long long #define ll long long #define pii pair <int, int> #define iiii pair <int, pii > #define mp make_pair #define INF 1000000000 #define rep(i, x) for(int (i) = 0; (i) < (x); (i)++) inline int getint() { int x = 0, p = 1; char c = getchar(); while (c <= 32) c = getchar(); if (c == 45) p = -p, c = getchar(); while (c > 32) x = x * 10 + c - 48, c = getchar(); return x * p; } using namespace std; const int mod = 1e9 + 7; inline void reduce(int &x) { x += x >> 31 & mod; } inline int mul(int x, int y) { return 1ll * x * y % mod; } //ruogu_alter const int N = 5e5 + 5; int n, q, a[N]; const int inf = 0x7f7f7f7f; struct node { int mn, se, mn2; int tgmn, tgmn2; int tgse, tgse2; inline void cl() { tgmn = tgmn2 = tgse = tgse2 = 0; } inline bool c() { return tgmn || tgmn2 || tgse || tgse2; } node() { cl(); se = inf; } } dat[N << 2]; // inline void up(int k) { dat[k].mn = min(dat[2 * k + 1].mn, dat[2 * k + 2].mn); dat[k].mn2 = min(dat[2 * k + 1].mn2, dat[2 * k + 2].mn2); if (dat[2 * k + 1].mn == dat[2 * k + 2].mn) { dat[k].se = min(dat[2 * k + 1].se, dat[2 * k + 2].se); } else if (dat[2 * k + 1].mn < dat[2 * k + 2].mn) { dat[k].se = min(dat[2 * k + 1].se, dat[2 * k + 2].mn); } else { dat[k].se = min(dat[2 * k + 1].mn, dat[2 * k + 2].se); } } inline void pd(node &x, node y, bool fg) { if (!fg) { y.tgmn = y.tgse; y.tgmn2 = y.tgse2; } x.mn += y.tgmn; x.mn2 = min(x.mn2, x.mn - y.tgmn + y.tgmn2); x.se = min(inf, x.se + y.tgse); x.tgmn += y.tgmn; x.tgmn2 = min(x.tgmn2, x.tgmn - y.tgmn + y.tgmn2); x.tgse += y.tgse; x.tgse2 = min(x.tgse2, x.tgse - y.tgse + y.tgse2); } inline void pd(int k) { if (dat[k].c()) { bool fx = (dat[2 * k + 1].mn <= dat[2 * k + 2].mn); bool fy = (dat[2 * k + 1].mn >= dat[2 * k + 2].mn); pd(dat[2 * k + 1], dat[k], fx); pd(dat[2 * k + 2], dat[k], fy); dat[k].cl(); } } void build(int l, int r, int k) { if (r - l == 1) { dat[k].mn = dat[k].mn2 = a[l]; return; } int mid = (l + r) >> 1; build(l, mid, 2 * k + 1); build(mid, r, 2 * k + 2); up(k); } void modify(int l, int r, int x, int y, int k, int v) { if (l >= y || x >= r) return; if (x <= l && r <= y) { dat[k].mn += v; dat[k].mn2 = min(dat[k].mn, dat[k].mn2); dat[k].se = min(dat[k].se + v, inf); dat[k].tgmn += v; dat[k].tgmn2 = min(dat[k].tgmn, dat[k].tgmn2); dat[k].tgse += v; dat[k].tgse2 = min(dat[k].tgse, dat[k].tgse2); return; } int mid = (l + r) >> 1; pd(k); modify(l, mid, x, y, 2 * k + 1, v); modify(mid, r, x, y, 2 * k + 2, v); up(k); } void modify2(int l, int r, int x, int y, int k, int v) { if (l >= y || x >= r || v <= dat[k].mn) return; if (x <= l && r <= y && v < dat[k].se) { dat[k].tgmn += v - dat[k].mn; dat[k].mn = v; return; } int mid = (l + r) >> 1; pd(k); modify2(l, mid, x, y, 2 * k + 1, v); modify2(mid, r, x, y, 2 * k + 2, v); up(k); } int qry(int l, int r, int x, int y, int k) { if (l >= y || x >= r) return inf; if (x <= l && r <= y) return dat[k].mn; int mid = (l + r) >> 1; pd(k); return min(qry(l, mid, x, y, 2 * k + 1), qry(mid, r, x, y, 2 * k + 2)); } int qry2(int l, int r, int x, int y, int k) { if (l >= y || x >= r) return inf; if (x <= l && r <= y) return dat[k].mn2; int mid = (l + r) >> 1; pd(k); return min(qry2(l, mid, x, y, 2 * k + 1), qry2(mid, r, x, y, 2 * k + 2)); } int main() { n = getint(); q = getint(); rep(i, n) a[i] = getint(); build(0, n, 0); rep(qq, q) { int op = getint(), l = getint() - 1, r = getint() - 1; if (op == 1) modify(0, n, l, r + 1, 0, getint()); if (op == 2) modify2(0, n, l, r + 1, 0, getint()); if (op == 3) printf("%d\n", qry(0, n, l, r + 1, 0)); if (op == 4) printf("%d\n", qry2(0, n, l, r + 1, 0)); } return 0; }
|