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
| #include <bits/stdc++.h>
const int kMaxN = 1e6 + 5;
int n, q, m; int a[kMaxN], x[kMaxN], v[kMaxN], unq[kMaxN]; std::set<int> st[kMaxN];
int getid(int x) { return std::lower_bound(unq + 1, unq + 1 + m, x) - unq; }
void discrete() { std::sort(unq + 1, unq + 1 + m); m = std::unique(unq + 1, unq + 1 + m) - (unq + 1); for (int i = 1; i <= n; ++i) a[i] = getid(a[i]); for (int i = 1; i <= q; ++i) v[i] = getid(v[i]); }
struct SGT { int mx[kMaxN * 4], tag[kMaxN * 4]; void pushup(int x) { mx[x] = std::max(mx[x << 1], mx[x << 1 | 1]); } void addtag(int x, int v) { mx[x] += v, tag[x] += v; } void pushdown(int x) { if (tag[x]) addtag(x << 1, tag[x]), addtag(x << 1 | 1, tag[x]), tag[x] = 0; } void build(int x, int l, int r) { if (l == r) return void(mx[x] = *st[l].rbegin() - n); int mid = (l + r) >> 1; build(x << 1, l, mid), build(x << 1 | 1, mid + 1, r); pushup(x); } void update(int x, int l, int r, int ql, int qr, int v) { if (l > qr || r < ql) return; else if (l >= ql && r <= qr) return addtag(x, v); pushdown(x); int mid = (l + r) >> 1; update(x << 1, l, mid, ql, qr, v), update(x << 1 | 1, mid + 1, r, ql, qr, v); pushup(x); } } sgt;
void update(int x, int v) { sgt.update(1, 1, m, 1, a[x] - 1, -1); int lst = *st[a[x]].rbegin(); st[a[x]].erase(x); sgt.update(1, 1, m, a[x], a[x], *st[a[x]].rbegin() - lst);
a[x] = v; sgt.update(1, 1, m, 1, a[x] - 1, 1); lst = *st[a[x]].rbegin(); st[a[x]].emplace(x); sgt.update(1, 1, m, a[x], a[x], *st[a[x]].rbegin() - lst); }
void dickdreamer() { std::cin >> n >> q; for (int i = 1; i <= n; ++i) std::cin >> a[i], unq[++m] = a[i]; for (int i = 1; i <= q; ++i) { std::cin >> x[i] >> v[i]; ++x[i]; unq[++m] = v[i]; } discrete(); for (int i = 1; i <= m; ++i) st[i].emplace(-1e9); for (int i = 1; i <= n; ++i) st[a[i]].emplace(i); sgt.build(1, 1, m); for (int i = 1; i <= n; ++i) sgt.update(1, 1, m, 1, a[i] - 1, 1); for (int i = 1; i <= q; ++i) { update(x[i], v[i]); std::cout << sgt.mx[1] << '\n'; } }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|