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

运行 ID: 98667

#include<cstdio> #include<set> #include<unordered_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;std::unordered_set<int>d; for(auto qr=split(r+1),ql=split(l);ql!=qr;ql++)d.insert(ql->v);return d.size();} const int N=1e5+1;int a[N]; int main(){int n,m;scanf("%d%d",&n,&m);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 o,l,r,c;m--&&scanf("%d%d%d",&o,&l,&r);)if(o==1){scanf("%d",&c);assign(l,r,c);}else printf("%d\n",query(l,r,0));}