提交时间:2023-08-16 13:31:42
运行 ID: 98755
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e6+100;//MX=3e7; int n,m,a[N],lsh[N],cnt;map<int,bool>b; struct ask{ int op,l,r,x,id; }in[N]; int LSH(int x){ return lower_bound(lsh+1,lsh+1+cnt,x)-lsh; } bool oka,okb; struct node{ int l,r,v; bool operator < (const 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=lower_bound(s.begin(),s.end(),(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}); } inline int query(int l,int r) { int ans=0; st qr=split(r+1),ql=split(l); st it=ql; for(;it!=qr;++it){ int x=(*it).v; if(!b[x]) ans++,b[x]=1; } for(it=ql;it!=qr;++it){ int x=(*it).v; b[x]=0; } 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]}); } int c[N]; int lowbit(int x){ return x&(-x); } void add(int x,int y){ for(int i=x;i<=n;i+=lowbit(i)) c[i]+=y; } int find(int l,int r){ int ans=0; for(int i=r;i;i-=lowbit(i)) ans+=c[i]; for(int i=l-1;i;i-=lowbit(i)) ans-=c[i]; return ans; } int cmp(ask a,ask b){ return a.r<b.r; } int ans[N]; signed main(){ // freopen("karry5307.in","r",stdin); // fre ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i],lsh[++cnt]=a[i]; for(int i=1;i<=m;i++){ cin>>in[i].op;in[i].id=i; if(in[i].op==1){ cin>>in[i].l>>in[i].r>>in[i].x,lsh[++cnt]=in[i].x; oka=1; } else cin>>in[i].l>>in[i].r; } sort(lsh+1,lsh+1+cnt);cnt=unique(lsh+1,lsh+1+cnt)-lsh-1; for(int i=1;i<=n;i++) a[i]=LSH(a[i]); for(int i=1;i<=m;i++){ if(in[i].op==1) in[i].x=LSH(in[i].x); } if(!oka){ sort(in+1,in+1+m,cmp); int tot=0; for(int i=1;i<=n;i++){ int x=a[i]; if(!b[x]){ b[x]=i; add(i,1); } else{ add(b[x],-1);add(i,1);b[x]=i; } while(in[tot].r<=i&&tot<=m){ if(in[tot].r==i) ans[in[tot].id]=find(in[tot].l,in[tot].r); tot++; } } for(int i=1;i<=m;i++) cout<<ans[i]<<'\n'; } else{ build(); for(int t=1;t<=m;t++){ int op=in[t].op,l=in[t].l,r=in[t].r; if(op==1){ update(l,r,in[t].x); } else{ cout<<query(l,r)<<'\n'; } } } return 0; }