提交时间:2023-08-16 13:05:08

运行 ID: 98722

#include <iostream> #include <cstdio> #include <set> using namespace std; typedef long long i64; const i64 SIZE = 2e5+5; struct node { i64 l,r; mutable i64 v; bool operator<(const node &rhs) const { return l < rhs.l; } }; set<node> s; typedef set<node>::iterator st; inline st split(i64 pos) { st it=lower_bound(s.begin(),s.end(),(node) { pos,0,0 }); if(it!=s.end() && it->l==pos) return it; it--; if(it->r<pos) return s.end(); 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 void assign(i64 l,i64 r,i64 x) { st pr=split(r+1),pl=split(l); s.erase(pl,pr),s.insert((node) { l,r,x }); } inline i64 query(i64 l,i64 r,i64 x) { i64 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; } i64 n, m; i64 a[SIZE]; i64 l, r, k; int main() { #ifdef fio freopen("test.in","r",stdin); #endif cin >> n >> m; i64 lst = -1, lsti = 0; for (i64 i = 1; i <= n; ++i) { scanf("%lld",a+i); if (a[i] != lst) { if (lst != -1) s.insert((node) { lsti, i - 1, lst }); lst = a[i]; lsti = i; } } s.insert((node) { lsti, n, lst }); for (i64 i = 1; i <= m; ++i) { scanf("%lld%lld%lld",&l,&r,&k); printf("%lld\n",query(l,r,k)); assign(l,r,k); } return 0; }