#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const int nax = 2e5+5;
vector<int> adj[nax];
int main() {
int n,m;
cin>>n>>m;
int tab[m+1][2];
set<int> free;
int one[n+1];
memset(one , -1 , sizeof one);
for (int i = 1; i <= m; ++i)
{
cin>>tab[i][0]>>tab[i][1];
if(tab[i][0]==0) free.insert(i);
else if(tab[i][1]==0) one[tab[i][0]]=i;
}
vector<pair<int,int>> ans;
for (int i = 1; i <= m; ++i)
{
if(tab[i][1]==tab[i][0]) continue;
if(tab[i][1]!=0){
if(one[tab[i][1]]!=-1){
ans.push_back({i,one[tab[i][1]]});
tab[one[tab[i][1]]][1]=tab[i][1];
tab[i][1]=0;
}else{
ans.push_back({i,*--free.end()});
one[tab[i][1]]=*--free.end();
free.erase(*--free.end());
tab[one[tab[i][1]]][0]=tab[i][1];
tab[i][1]=0;
}
if(one[tab[i][0]]==-1) one[tab[i][0]]=i;
}
if(tab[i][0]!=0){
if(one[tab[i][0]]==i) continue;
ans.push_back({i,one[tab[i][0]]});
tab[one[tab[i][0]]][1]=tab[i][0];
tab[i][0]=0;
free.insert(i);
}
}
cout <<ans.size()<<endl;
for(auto u : ans) cout << u.fi <<" "<<u.se<<endl;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |