提交时间:2023-08-16 12:47:37

运行 ID: 98700

#include <bits/stdc++.h> using namespace std; typedef long long ll; int N, M; struct Node { int l, r, v; }; bool operator<(Node x, Node y) { return x.l < y.l; } struct ODT { set<Node> nds; void addnode(int l, int r, int v) { nds.insert(Node{.l = l, .r = r, .v = v}); } set<Node>::iterator split(int p) { auto it(nds.upper_bound(Node{.l = p})); --it; if (it->l == p) return it; if (it->r <= p) return nds.end(); int l(it->l), r(it->r), v(it->v); nds.erase(it); nds.insert(Node{.l = l, .r = p, .v = v}); return nds.insert(Node{.l = p, .r = r, .v = v}).first; } int query(int l, int r, int v) { set<Node>::iterator ri(split(r)); set<Node>::iterator li(split(l)); int ans(0); for (auto i(li); i != ri; ++i) if (i->v == v) ans += i->r - i->l; nds.erase(li, ri); nds.insert(Node{.l = l, .r = r, .v = v}); return ans; } }; int main() { cin >> N >> M; map<ll, int> mp; ODT tree; for (int i(0); i != N; ++i) { ll x(0); cin >> x; if (mp.find(x) == mp.end()) mp[x] = mp.size(); tree.addnode(i, i + 1, mp[x]); } for (int l(0), r(0); M--;) { ll c(0); cin >> l >> r >> c; --l; if (mp.find(c) == mp.end()) mp[c] = mp.size(); cout << tree.query(l, r, mp[c]) << endl; } return 0; }