提交时间:2023-08-16 12:38:05
运行 ID: 98689
#include<bits/stdc++.h> using namespace std; #define N 100005 int unit; struct que{ int l,r,t,id; inline bool operator<(const que&x)const{ return ((l/unit)^(x.l/unit))?l<x.l:(((r/unit)^(x.r/unit))?r<x.r:t<x.t); } }q[N]; int kls; int ans[N]; int as=0; int cnt[N<<1]; int a[N]; struct cg{ int p,pr,px,x; }c[N]; int te; struct node{ int v,op,p; inline bool operator<(const node&x)const{ return v<x.v; } }lsh[N<<1]; int nt[N]; int tot; inline void add(int x) { if(!cnt[x])as++; cnt[x]++; } inline void del(int x) { cnt[x]--; if (!cnt[x])as--; } unordered_map<int,int>mp; struct ODT{ int l,r; mutable int v; inline bool operator<(const ODT&x)const{ return l<x.l; } }; set<ODT>odt; inline auto split(int x){ auto it=odt.lower_bound({x,0,0}); if(it!=odt.end()&&it->l==x)return it; --it; if(it->r<x)return odt.end(); int l=it->l,r=it->r,v=it->v; odt.erase(it),odt.insert({l,x-1,v}); return odt.insert({x,r,v}).first; } inline void ass(int l,int r,int v){ auto itr=split(r+1),itl=split(l); odt.erase(itl,itr),odt.insert({l,r,v}); } int stk[N],top; inline int qry(int l,int r){ int ans=0; auto itr=split(r+1),itl=split(l); for(;itl!=itr;++itl) if(!cnt[(*itl).v])ans++,cnt[(*itl).v]=1,stk[++top]=(*itl).v; while(top)cnt[stk[top]]=0,top--; return ans; } int main(){ bool fl=0; int n,m; scanf("%d%d",&n,&m); unit=pow(n,(double)2/(double)3); for(int i=1;i<=n;i++) scanf("%d",&a[i]),lsh[++tot]={a[i],0,i},nt[i]=a[i]; for(int i=1;i<=m;i++){ int op,l,r,x; scanf("%d",&op); if(op==1){ scanf("%d%d%d",&l,&r,&x); if(l!=r)fl=1; c[++te]={l,r,nt[l],x}; nt[l]=x; lsh[++tot]={x,1,te}; }else{ scanf("%d%d",&l,&r),kls++; q[kls]={l,r,te,kls}; } } if(fl){ int ct=0; sort(lsh+1,lsh+tot+1); for(int i=1;i<=tot;i++){ if(lsh[i].v!=lsh[i-1].v)ct++; if(lsh[i].op)c[lsh[i].p].x=ct; else a[lsh[i].p]=ct; } for(int i=1;i<=n;i++) odt.insert({i,i,a[i]}); int ti=0; for(int i=1;i<=kls;i++){ while(ti<q[i].t)ti++,ass(c[ti].p,c[ti].pr,c[ti].x); printf("%d\n",qry(q[i].l,q[i].r)); } return 0; } sort(q+1,q+kls+1); sort(lsh+1,lsh+tot+1); int ct=0; lsh[0].v=-1; for(int i=1;i<=tot;i++){ if(lsh[i].v!=lsh[i-1].v)ct++,mp[lsh[i].v]=ct; if(lsh[i].op)c[lsh[i].p].x=ct; else a[lsh[i].p]=ct; } for(int i=1;i<=te;i++) c[i].px=mp[c[i].px]; int l=1,r=0,t=0; for(int i=1;i<=kls;i++){ while(t<q[i].t){ t++; if(l<=c[t].p&&c[t].p<=r) del(c[t].px),add(c[t].x); a[c[t].p]=c[t].x; } while(t>q[i].t){ if(l<=c[t].p&&c[t].p<=r) del(c[t].x),add(c[t].px); a[c[t].p]=c[t].px; t--; } while(l>q[i].l)l--,add(a[l]); while(r<q[i].r)r++,add(a[r]); while(r>q[i].r)del(a[r]),r--; while(l<q[i].l)del(a[l]),l++; ans[q[i].id]=as; } for(int i=1;i<=kls;i++) printf("%d\n",ans[i]); return 0; } /* */