P5692 [MtOI2019] 手牵手走向明天
cnblogs
P5692 [MtOI2019] 手牵手走向明天
题意
将区间内所有
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define re register
#define getchar()(p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<22,stdin),p1==p2)?EOF:*p1++)
char buf[1<<22],*p1=buf,*p2=buf;
const int N=1e5+10,sq=360,len=350,star=1e8,V=1e5;
int n,m,a[N],L,R,cntB,idx,l,r,x,y;
int fst[sq],lst[sq],ans[sq][sq],id[N];
vector<int>v;
#define pb emplace_back
il int read(){
re 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<<3)+(x<<1)+(c^48),c=getchar();
return x*f;
}
struct query{
int op,l,r,x,y,ans;
int lstx,lsty;
}q[N];
il void Calc(int &i){
for(re int j=1;j<=idx;j++)ans[i][j]=star;
ans[i][i]=0,lst[i]=0;
for(re int j=L,now=star;j<=R;j++)
if(a[j]==i)now=0,lst[i]=j;
else ans[i][a[j]]=ans[a[j]][i]=min(ans[i][a[j]],++now);
for(re int j=R,now=star;j>=L;j--)
if(a[j]==i)now=0,fst[i]=j;
else ans[i][a[j]]=ans[a[j]][i]=min(ans[i][a[j]],++now);
if(!lst[i])v.pb(i),i=0;
}
il void Build(){
vector<int>().swap(v);
for(re int i=1;i<=V;i++)id[i]=0;
idx=0;
for(re int i=L;i<=R;i++){
if(!id[a[i]])id[a[i]]=++idx;
a[i]=id[a[i]];
}
for(re int i=1;i<=idx;i++)Calc(i);
}
il void Modify(int &x,int &y){
if(!x||x==y)return;
if(l>L||r<R){
if(!y){
if(v.empty())y=++idx;
else y=v.back(),v.pop_back();
}
for(re int i=max(l,L);i<=min(r,R);i++)if(a[i]==x)a[i]=y;
return Calc(x),Calc(y);
}
if(!y)return y=x,x=0,void();
for(re int i=L;i<=R;i++)if(a[i]==x)a[i]=y;
return Calc(x),Calc(y),void();
}
il void Solve(int &res,int &lstx,int &lsty){
x=id[x],y=id[y];
if(!x&&!y)return;
if(l>L||r<R){
for(re int i=max(l,L);i<=min(r,R);i++){
if(a[i]==x&&a[i]==y)return res=0,void();
else if(a[i]==x)res=min(res,i-lsty),lstx=i;
else if(a[i]==y)res=min(res,i-lstx),lsty=i;
}
return;
}
if(x==y)return res=0,void();
if(x)res=min(res,fst[x]-lsty);
if(y)res=min(res,fst[y]-lstx);
if(x)lstx=lst[x];
if(y)lsty=lst[y];
if(x&&y)res=min(res,ans[x][y]);
}
int main(){
n=read(),m=read(),cntB=(n-1)/len+1;
for(re int i=1;i<=n;i++)a[i]=read();
for(re int i=1;i<=m;i++)
q[i].op=read(),q[i].l=read(),q[i].r=read(),
q[i].x=read(),q[i].y=read(),q[i].ans=star,
q[i].lstx=q[i].lsty=-star;
for(re int _=1;_<=cntB;_++){
L=R+1,R=min(_*len,n);
Build();
for(re int i=1;i<=m;i++){
l=q[i].l,r=q[i].r,x=q[i].x,y=q[i].y;
if(l>R||r<L)continue;
if(q[i].op==1)Modify(id[x],id[y]);
else Solve(q[i].ans,q[i].lstx,q[i].lsty);
}
}
for(re int i=1;i<=m;i++)
if(q[i].op==2)cout<<((q[i].ans==star)?-1:q[i].ans)<<'\n';
return 0;
}