提交时间:2023-08-16 12:55:19

运行 ID: 98709

#include<bits/stdc++.h> using namespace std; const int N = 2e5 + 5; struct node { int l, r; mutable int v; //对节点排序 inline bool operator < (const node &t) const {return l < t.l;} }; int a[N]; int n, m; set<node>s; #define st set<node> :: iterator inline st split(int pos) { if(pos > n) return s.end(); st it = --s.upper_bound((node){pos, 0, 0}); if(it -> l == pos) return it; int l = it -> l, r = it -> r, v = it -> v; s.erase(it); s.insert((node){l, pos - 1, v}); return s.insert((node){pos, r, v}).first; } inline int query(int l, int r, int x) { int ans = 0; st qr = split(r + 1), ql = split(l); for(; ql != qr; ql++) if((*ql).v == x) ans += (*ql).r - (*ql).l + 1; return ans; } inline void assign(int l, int r, int x) { st pr = split(r + 1), pl = split(l); s.erase(pl, pr); s.insert((node){l, r, x}); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 1; i <= n; i++) cin >> a[i]; int L = 1; for(int i = 1; i <= n; i++) { if(a[i] != a[i + 1]) { s.insert((node){L, i, a[i]}); L = i + 1; } } for(int i = 1; i <= m; i++) { int l, r, c; cin >> l >> r >> c; cout << query(l, r, c) << '\n'; assign(l, r, c); } return 0; }