rt,以下代码即使加上 O2 最高分也只是 64(
#include<bits/stdc++.h>
//#define int long long
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
inline void write(int x){
if(x<0) x=~x+1,putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
const int N=100009;
const int M=180;
const int S=320;
int size=600,sizeval=317,mval=100000;
int n,m,block,a[N];
int top=0,sta[N];
int L[M],R[M];
int bel[N];
int s1[S],s2[N];
int cnt[M][N];
int sumc[M][N],sums[M][S];
int fa[N],rt[M][N];
int find(int x){
if(fa[x]==x) return fa[x];
fa[x]=find(fa[x]);
return fa[x];
}
void Build(int b){
for(int i=L[b];i<=R[b];i++){
if(!rt[b][a[i]]) rt[b][a[i]]=i;
else fa[i]=rt[b][a[i]];
cnt[b][a[i]]++;
}
}
void ReBuild(int b,int l,int r,int x,int y){
int tmp=0;
top=0;
rt[b][x]=rt[b][y]=0;
for(int i=L[b];i<=R[b];i++){
a[i]=a[find(i)];
if(a[i]==x||a[i]==y) sta[++top]=i;
}
for(int i=l;i<=r;i++){
if(a[i]==x) a[i]=y,tmp++;
}
cnt[b][x]-=tmp,cnt[b][y]+=tmp;
for(int i=1;i<=top;i++) fa[sta[i]]=sta[i];
for(int i=1;i<=top;i++){
if(!rt[b][a[sta[i]]]) rt[b][a[sta[i]]]=sta[i];
else fa[sta[i]]=rt[b][a[sta[i]]];
}
for(int i=b;i<=block;i++){
sumc[i][x]-=tmp,sumc[i][y]+=tmp;
if (bel[x]!=bel[y]) sums[i][bel[x]]-=tmp,sums[i][bel[y]]+=tmp;
}
}
void update(int l,int r,int x,int y){
int lb=(l-1)/size+1;
int rb=(r-1)/size+1;
if(lb==rb) ReBuild(lb,l,r,x,y);
else{
ReBuild(lb,l,R[lb],x,y);
ReBuild(rb,L[rb],r,x,y);
int tmp=0,tmps=0;
for(int i=lb+1;i<=rb-1;i++){
if(rt[i][x]){
if(!rt[i][y]) rt[i][y]=rt[i][x],a[rt[i][x]]=y;
else fa[rt[i][x]]=rt[i][y];
rt[i][x]=0;
tmp=cnt[i][x];
tmps+=tmp;
cnt[i][y]+=tmp,cnt[i][x]=0;
}
sumc[i][x]-=tmps,sumc[i][y]+=tmps;
if(bel[x]!=bel[y]) sums[i][bel[x]]-=tmps,sums[i][bel[y]]+=tmps;
}
for(int i=rb;i<=block;i++){
sumc[i][x]-=tmps,sumc[i][y]+=tmps;
if(bel[x]!=bel[y]) sums[i][bel[x]]-=tmps,sums[i][bel[y]]+=tmps;
}
}
}
void query(int l,int r,int k){
int lb=(l-1)/size+1;
int rb=(r-1)/size+1;
if(lb==rb){
for(int i=l;i<=r;i++){
a[i]=a[find(i)];
s1[bel[a[i]]]++;
s2[a[i]]++;
}
int vl,vr,sum=0;
for(int i=1;i<=sizeval;i++){
sum+=s1[i];
if(sum>=k){
sum-=s1[i];
vl=(i-1)*sizeval+1,vr=i*sizeval;
break;
}
}
for(int i=vl;i<=vr;i++){
sum+=s2[i];
if(sum>=k){
write(i);
putchar('\n');
break;
}
}
for(int i=l;i<=r;i++) s2[a[i]]--,s1[bel[a[i]]]--;
}
else{
for(int i=l;i<=R[lb];i++){
a[i]=a[find(i)];
s1[bel[a[i]]]++;
s2[a[i]]++;
}
for(int i=L[rb];i<=r;i++){
a[i]=a[find(i)];
s1[bel[a[i]]]++;
s2[a[i]]++;
}
int vl,vr,sum=0;
for(int i=1;i<=sizeval;i++){
sum+=s1[i]+sums[rb-1][i]-sums[lb][i];
if(sum>=k){
sum-=s1[i]+sums[rb-1][i]-sums[lb][i];
vl=(i-1)*sizeval+1,vr=i*sizeval;
break;
}
}
for(int i=vl;i<=vr;i++){
sum+=s2[i]+sumc[rb-1][i]-sumc[lb][i];
if(sum>=k){
write(i);
putchar('\n');
break;
}
}
for(int i=l;i<=R[lb];i++){
s1[bel[a[i]]]--;
s2[a[i]]--;
}
for(int i=L[rb];i<=r;i++){
s1[bel[a[i]]]--;
s2[a[i]]--;
}
}
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
fa[i]=i;
}
block=(n-1)/size+1;
for(int i=1;i<=mval;i++) bel[i]=(i-1)/sizeval+1;
for(int i=1;i<=block;i++){
L[i]=(i-1)*size+1;
R[i]=min(i*size,n);
Build(i);
for(int j=1;j<=sizeval;j++) sums[i][j]=sums[i-1][j];
for(int j=1;j<=mval;j++) sumc[i][j]=sumc[i-1][j]+cnt[i][j];
for(int j=L[i];j<=R[i];j++) sums[i][bel[a[j]]]++;
}
while(m--){
int opt,x,y,l,r,k;
opt=read();
if(opt==1){
l=read(),r=read(),x=read(),y=read();
update(l,r,x,y);
}
else{
l=read(),r=read(),k=read();
query(l,r,k);
}
}
return 0;
}
会不会是要在一个人少的时候提交(