提交时间:2023-08-16 12:45:16

运行 ID: 98696

#include<bits/stdc++.h> using namespace std; struct num{ int l,r; long long v; }; bool operator < (num a,num b){ return (a.l<b.l); } set<num> t; inline auto sp(int x){ auto it=lower_bound(t.begin(),t.end(),(num){x,0,0}); if(it!=t.end() && it->l==x) return it; it--; if(it->r<x) return t.end(); int ll=it->l,rr=it->r,vv=it->v;; t.erase(it),t.insert((num){ll,x-1,vv}); return t.insert((num){x,rr,vv}).first; } inline int query(int l,int r,long long x){ int ret=0; auto tmp=sp(r+1),cun=sp(l); for(;cun!=tmp;cun++) if(cun->v==x) ret+=(cun->r-cun->l+1); return ret; } inline void chan(int l,int r,long long x){ auto cun=sp(r+1),tmp=sp(l); t.erase(tmp,cun),t.insert({l,r,x}); } int main(){ int n,m,l,r,lai=0; scanf("%d%d",&n,&m); long long in,lan=LONG_LONG_MAX,x; for(int i=1;i<=n;i++){ scanf("%lld",&in); if(in!=lan){ if(lan!=LONG_LONG_MAX) t.insert((num){lai,i-1,lan}); lan=in,lai=i; } } t.insert((num){lai,n,lan}); for(int i=1;i<=m;i++){ scanf("%d%d%lld",&l,&r,&x); printf("%d\n",(query(l,r,x))); chan(l,r,x); } return 0; }/* Samples 1: Input: 4 4 1 2 2 4 1 3 1 1 4 4 1 2 2 1 4 2 Output: 1 1 0 2 Samples 2: Input: 6 4 1 1 4 5 1 4 1 1 4 1 5 1 4 6 4 1 6 1 Output: 0 2 1 3 */