提交时间:2023-08-16 13:58:00

运行 ID: 98767

#include<bits/stdc++.h> using namespace std; #define int long long const int MX=1e6; int n,m,a[MX]; struct node{ int l,r,v; bool operator < (node b)const{ if(l<b.l) return 1; else return 0; } }; set<node>s; #define st set<node>::iterator st split(int pos){ st it=s.lower_bound((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; } void update(int l,int r,int x){ st pl=split(l),pr=split(r+1); s.erase(pl,pr);s.insert((node){l,r,x}); } 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; } void build(){ int l=1,r=1; for(int i=2;i<=n;i++){ if(a[i]!=a[i-1]){ s.insert(node{l,r,a[i-1]}); l=r=i; } else r=i; } s.insert(node{l,r,a[n]}); } signed main(){ // freopen("ODT.in","r",stdin); // freopen("ODT.out","w",stdout); ios::sync_with_stdio(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } build(); while(m--){ int l,r,c; cin>>l>>r>>c; cout<<query(l,r,c)<<'\n'; update(l,r,c); } return 0; }