拍半天了,拍不出来,求hack qwq
查看原帖
拍半天了,拍不出来,求hack qwq
416521
NATURAL6楼主2023/7/24 21:52
#include<bits/stdc++.h>
using namespace std;
inline int qread()
{
	int a=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){(a*=10)+=(ch^48);ch=getchar();}
	return a*f;
}
int n,m,a[100010],ans;
int cl,c[100010],st[100010],ed[100010],dis[300][300][300],id[350][350],L[350][350],R[350][350],lsh[350][350],LSH[350],pos[350][100010]; 
vector<int>P[100010];
inline int Qs(int x,int y)
{
	int an=n+1,p=0;
	for(int i:P[x])
	{
		while(p<(int)P[y].size()&&P[y][p]<i)an=min(an,i-P[y][p++]);
		if(p<P[y].size())an=min(P[y][p]-i,an);
	}
	return an;
}
inline void build(int x)
{
	for(int i=st[x];i<=ed[x];++i)P[lsh[x][++LSH[x]]=a[i]].emplace_back(i);
	sort(lsh[x]+1,lsh[x]+1+LSH[x]);
	LSH[x]=unique(lsh[x]+1,lsh[x]+1+LSH[x])-lsh[x]-1;
	for(int i=1;i<=LSH[x];++i)
	{
		pos[x][lsh[x][i]]=i;
		for(int j=st[x];j<=ed[x];++j)if(a[j]==lsh[x][i])L[x][i]=min(L[x][i],j),R[x][i]=j;
		for(int j=i+1;j<=LSH[x];++j)dis[x][i][j]=Qs(lsh[x][i],lsh[x][j]);
		P[lsh[x][i]].clear();
	}
	return ;
}
inline void solve(int id,int x,int y)
{
	if(!pos[id][x])return ;
	if(!pos[id][y])
	{
		pos[id][y]=pos[id][x];pos[id][x]=0;
		for(int i=1;i<=LSH[id];++i)if(lsh[id][i]==x)lsh[id][i]=y;
		return ;
	}
	pos[id][x]=0;int idx=0,idy=0;
	for(int i=1;i<=LSH[id];++i)
	{
		if(lsh[id][i]==y)idy=i;
		if(lsh[id][i]==x)idx=i,lsh[id][i]=-1;
	}
	L[id][idy]=min(L[id][idy],L[id][idx]);
	R[id][idy]=max(R[id][idy],R[id][idx]);
	for(int i=1;i<=LSH[id];++i)
	{
		if(!~lsh[id][i]||i==idy)continue;
		if(i<idy)dis[id][i][idy]=min(dis[id][i][idy],(i<idx)?dis[id][i][idx]:dis[id][idx][i]);
		else dis[id][idy][i]=min(dis[id][idy][i],(i<idx)?dis[id][i][idx]:dis[id][idx][i]);
	}
	return ;
}
inline int Q(int x,int y)
{
	int an=n+1,lx=-n,ly=-n;
	for(int i=1,idx,idy;i<=c[n];++i)
	{
		idx=pos[i][x],idy=pos[i][y];
		if(idx)an=min(an,L[i][idx]-ly);
		if(idy)an=min(an,L[i][idy]-lx);
		if(idx)lx=R[i][idx];if(idy)ly=R[i][idy];
		if(idx>idy)swap(idx,idy);
		if(idx&&idy)an=min(an,dis[i][idx][idy]);
	}
	if(an==n+1)return -1;
	return an;
}
inline void pw(int x)
{
	for(int i=1;i<=LSH[x];++i)printf("[%d %d] ",i,lsh[x][i]);puts("");
	for(int i=1;i<=LSH[x];++i)printf("{%d %d} ",L[x][i],R[x][i]);puts("");
	for(int i=1;i<=LSH[x];++i)
	{
		for(int j=1;j<=LSH[x];++j)printf("%d ",dis[x][i][j]);
		puts("");
	}
	return ;
}
int main()
{
//	freopen("1.in","r",stdin);
//	freopen("1.out","w",stdout);
	n=qread();m=qread();cl=350;
	memset(L,63,sizeof(L));
	for(int i=1;i<=n;++i)a[i]=qread(),c[i]=(i-1)/cl+1,ed[c[i]]=i;
	for(int i=n;i;--i)st[c[i]]=i;
	for(int i=1;i<=c[n];++i)build(i);
	for(int i=1,op,x,y;i<=m;++i)
	{
		op=qread();x=qread()^ans,y=qread()^ans;
//		op=qread();x=qread();y=qread();
		if(op==1)
		{
			if(x==y)continue;
			for(int j=1;j<=c[n];++j)solve(j,x,y);
		}
		else
		{
			ans=Q(x,y);
			if(~ans)printf("%d\n",ans);
			else ans=0,puts("Ikaros");
		}
	}
	return 0;
}


2023/7/24 21:52
加载中...