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
| #include <bits/stdc++.h> using namespace std; #define int long long
struct node { int l, r; mutable int v; node(int _l, int _r = -1, int _v = 0) : l(_l), r(_r), v(_v) { } friend bool operator<(node a, node b) { return a.l < b.l; } };
set<node> s;
auto split(int pos) { auto it = s.lower_bound(node(pos, 0, 0)); if (it != s.end() && it->l == pos) { return it; } it--; int l = it->l, t = it->r, v = it->v; s.erase(it), s.insert(node(l, pos - 1, v)); return s.insert(node(pos, t, v)).first; }
void assign(int l, int r, int v) { auto itr = split(r + 1), itl = split(l); s.erase(itl, itr), s.insert(node(l, r, v)); }
int query(int l,int r,int v) { auto itr = split(r + 1), itl = split(l); int cnt = 0; for (auto it = itl; it != itr; it++) { if (it->v == v)cnt += (it->r - it->l + 1); } return cnt; }
const int N = 1e6 + 5; int n, a[N];
signed main() { cin >> n; s.insert(node(1, n, 0)); for (int i = 1; i <= n; i++) { cin >> a[i]; assign(i, i, a[i]); } int _ = n; for (; _--;) { int l, r, c; cin >> l >> r >> c; cout << query(l, r, c) << "\n"; assign(l, r, c); } return 0; }
|