Solution Notes (Albert Gu): Consider two cows labeled A and B. Suppose that in the original ordering, A came before B. Notice that in the five photographs, neither A nor B moved in at least three of them (that is, A and B must still be in the correct relative order in at least three of the photographs). Given these five photographs, we can just compare the number of times A came before B; if it is three or more, then A is before B in the original ordering, otherwise B is before A in the original ordering. This provides us with a fast comparison function between any two cows. Now all that is left is sorting all the cows using this comparator.

Here is Mark Gordon's short solution:

``````
#include <iostream>
#include <algorithm>
#include <map>
#include <cstdio>

using namespace std;

#define MAXN 20000

int A[MAXN];
map<int, int> pos[5];

bool cmp(int a, int b) {
int f = 0;
for(int i = 0; i < 5; i++) {
f += pos[i][a] < pos[i][b];
}
return f > 2;
}

int main() {
freopen("photo.in", "r", stdin);
freopen("photo.out", "w", stdout);
int N; cin >> N;
for(int i = 0; i < 5; i++) {
for(int j = 0; j < N; j++) {
int x; cin >> x;
pos[i][x] = j;
A[j] = x;
}
}
sort(A, A + N, cmp);
for(int i = 0; i < N; i++) {
cout << A[i] << '\n';
}
}
``````