求调abc233f,玄关。
#include<bits/stdc++.h>
using namespace std;
struct Edge{
int to,id;
};
int a[10001],vis[10001],p[10001],st[500001];
vector<Edge>g[10001];
int n,m,cnt;
bool swapOT(int from,int to,int fa){
if(from==to)return 1;
for(auto i:g[from]){
if(i.to==fa)continue;
int tmp=swapOT(i.to,to,from);
if(tmp){
swap(a[from],a[i.to]);
swap(p[a[from]],p[i.to]);
st[++cnt]=i.id;
return 1;
}
}
return 0;
}
void dfs(int x){
vis[x]=1;
for(auto i:g[x]){
if(!vis[i.to])dfs(i.to);
}
if(!swapOT(p[x],x,0)){
cout<<-1;
exit(0);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i],p[a[i]]=i;
cin>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back({v,i});
g[v].push_back({u,i});
}
for(int i=1;i<=n;i++){
if(!vis[i])dfs(i);
}
cout<<cnt<<"\n";
for(int i=1;i<=cnt;i++)cout<<st[i]<<" ";
}