提交时间:2023-08-16 09:06:11
运行 ID: 98533
#include<cstdio> #include<vector> #include<set> struct Rg{int l,r;mutable int v;}; bool operator<(const Rg&x,const Rg&y){return x.l<y.l;} std::set<Rg>s; #define Z static inline Z std::set<Rg>::iterator split(int p){auto it=s.lower_bound({p,0,0}); if(it!=s.end()&&it->l==p)return it;it--;if(it->r<p)return s.end(); int l=it->l,r=it->r,v=it->v;s.erase(it),s.insert({l,p-1,v});return s.insert({p,r,v}).first;} Z void assign(int l,int r,int x){auto pr=split(r+1),pl=split(l);s.erase(pl,pr);s.insert({l,r,x});} Z int query(int l,int r,int x){int w=0;for(auto qr=split(r+1),ql=split(l); ql!=qr;ql++)if(ql->v==x)w+=ql->r-ql->l+1;return w;} int main(){int n,m;scanf("%d%d",&n,&m);std::vector<int>a(n+1);for(int i=1;i<=n;i++)scanf("%d",&a[i]); int bg=0;for(int i=1;i<=n+1;i++)if(a[i]!=a[i-1]){if(bg)s.insert({bg,i-1,a[i-1]});bg=i;} for(int l,r,c;m--&&scanf("%d%d%d",&l,&r,&c);){printf("%d\n",query(l,r,c));assign(l,r,c);}}