提交时间:2026-06-10 13:48:37
运行 ID: 42030
#include<bits/stdc++.h> using namespace std; int n,m,a[10][100005],rk[10][100005],st[6][20][6][100005],p[6],_[6]; int main(){ scanf("%d%d",&n,&m); memset(st,0x3f,sizeof(st)); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ scanf("%d",&a[i][j]); rk[i][a[i][j]]=j; } } for(int i=1;i<=m;++i){ for(int j=1;j<=m;++j){ int nmin=n+1; for(int k=n;k>=1;k--){ nmin=min(nmin,rk[j][a[i][k]]); st[i][0][j][k]=nmin; } } } for(int f=1;f<=19;++f){ for(int i=1;i<=m;++i){ for(int j=1;j<=m;++j){ for(int k=1;k<=n;k++){ for(int z=1;z<=m;++z){ st[i][f][j][k]=min(st[i][f][j][k],st[z][f-1][j][st[i][f-1][z][k]]); } } } } } int q; scanf("%d",&q); while(q--){ int x,y; scanf("%d%d",&x,&y); int flag=0; for(int i=1;i<=m;i++){ if(rk[i][x]<rk[i][y]){ flag=1; } p[i]=rk[i][x]; } if(flag==1){ printf("1\n"); continue; } int ans=0; for(int f=19;f>=0;f--){ memset(_,0x3f,sizeof(_)); for(int i=1;i<=m;++i){ for(int j=1;j<=m;++j){ _[j]=min(_[j],st[i][f][j][p[i]]); } } int flag=0; for(int i=1;i<=m;i++){ if(_[i]<=rk[i][y])flag=1; } if(flag==0){ ans+=(1<<f); for(int i=1;i<=m;i++){ p[i]=_[i]; } } if(ans>n){ printf("-1\n"); ans=-1; break; } } if(ans!=-1) printf("%d\n",ans+2); } }