提交时间:2023-08-16 09:27:24

运行 ID: 98541

#include<bits/stdc++.h> #define int long long using namespace std; inline int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } int n,m,nxt=1,a[100005],b[1000005],t[1000005],ans[100005]; struct node{int l,r,id;}q[100005]; bool cmp(node x,node y){return x.r<y.r;} int lowbit(int x){return x&-x;} void add(int x,int now){while(x<=n)t[x]+=now,x+=lowbit(x);} int sum(int x,int ans=0){while(x)ans+=t[x],x-=lowbit(x);return ans;} signed main(){ n=read(),m=read(); for(int i=1;i<=n;i++)a[i]=read(); if(n<=5000&&m<=5000){ while(m--){ int opt=read(),l=read(),r=read(),x; if(opt==1){ x=read(); for(int i=l;i<=r;i++)a[i]=x; }else{ set<int>s; for(int i=l;i<=r;i++)s.insert(a[i]); cout<<s.size()<<endl; } } }else{ for(int i=1,opt,l,r;i<=m;i++)opt=read(),q[i].id=i,q[i].l=read(),q[i].r=read(); sort(q+1,q+m+1,cmp); for(int i=1;i<=m;i++){ for(int j=nxt;j<=q[i].r;j++){ if(b[a[j]])add(b[a[j]],-1); add(j,1),b[a[j]]=j; } nxt=q[i].r+1,ans[q[i].id]=sum(q[i].r)-sum(q[i].l-1); } for(int i=1;i<=m;i++)cout<<ans[i]<<endl; } return 0; }