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
| #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int , int> pi; const int N = 2e5 + 10; int n , q; int a[N]; struct node { int ma , ma2 , cnt , cnt2; }t[N * 4]; node hb(node x , node y) { node res = { -1, -1, 0, 0 }; int cur[5] = { 0, x.ma, y.ma, x.ma2, y.ma2 }; sort(cur + 1 , cur + 1 + 4); for (int i = 1; i <= 4; i++) { if (cur[i] == cur[i - 1]) continue; if (cur[i] > res.ma) res.ma2 = res.ma , res.ma = cur[i]; else if (cur[i] > res.ma2) res.ma2 = cur[i]; } if (res.ma == x.ma) res.cnt += x.cnt; if (res.ma == y.ma) res.cnt += y.cnt; if (res.ma2 == x.ma) res.cnt2 += x.cnt; if (res.ma2 == x.ma2) res.cnt2 += x.cnt2; if (res.ma2 == y.ma) res.cnt2 += y.cnt; if (res.ma2 == y.ma2) res.cnt2 += y.cnt2; if (res.ma2 == res.ma) res.ma2 = -1 , res.cnt2 = 0; return res; }
void build(int p , int l , int r) { if (l == r) t[p] = { a[l], -1, 1, 0 }; else build(p * 2 , l , l + r >> 1) , build(p * 2 + 1 , (l + r >> 1) + 1 , r) , t[p] = hb(t[p * 2] , t[p * 2 + 1]); } void updata(int p , int l , int r , int k , int x) { if (l == r) t[p] = { x, -1, 1, 0 }; else { int mid = l + r >> 1; if (mid >= k) updata(p * 2 , l , mid , k , x); if (mid < k) updata(p * 2 + 1 , mid + 1 , r , k , x); t[p] = hb(t[p * 2] , t[p * 2 + 1]); } } node getans(int p , int l , int r , int ql , int qr) { if (ql <= l && r <= qr) {return t[p]; } int mid = l + r >> 1; node res = { -1, -1, -1, -1 }; if (mid >= ql) res = getans(p * 2 , l , mid , ql , qr); if (mid < qr) { node x = getans(p * 2 + 1 , mid + 1 , r , ql , qr); if (res.ma != -1) res = hb(res , x); else res = x; } return res; }
signed main() { ios::sync_with_stdio(0); cin >> n >> q; for (int i = 1; i <= n; i++) cin >> a[i]; build(1 , 1 , n); while (q--) { int opt , l , r; cin >> opt >> l >> r; if (opt == 1) updata(1 , 1 , n , l , r); else cout << getans(1 , 1 , n , l , r).cnt2 << endl; } return 0; }
|