#include <iostream>
#include <vector>
#include <set>
using namespace std;
using vi = vector<int>;
using pii = pair<int, int>;
using vpii = vector<pii>;
const int MAXN = 3e5 + 7;
#define ff first
#define ss second
const int base = 1 << 19;
int tree[base * 2]; // wierzcholek min czyli min po czasie
int query(int l, int r) {
l += base - 1;
r += base + 1;
int ans = 1e9;
while (l / 2 != r / 2) {
if (l % 2 == 0) ans = min(ans, tree[l + 1]);
if (r % 2 == 1) ans = min(ans, tree[r - 1]);
l /= 2;
r /= 2;
}
return ans;
}
set<int> events[base]; //eventy dla danego rank'u
void update(int rank, int time) {
if (events[rank].find(time) != events[rank].end()) events[rank].erase(time);
else events[rank].insert(time);
int v = rank;
v += base;
tree[v] = 1e9;
if (events[rank].size()) tree[v] = *events[rank].begin();
v /= 2;
while (v) {
tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
v /= 2;
}
}
vi graf[MAXN];
int xorr[MAXN];
int ranks[MAXN];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
for (int i = 0; i < base * 2; i++) tree[i] = 1e9;
int n;
cin >> n;
vi tab(n);
vi rooty(n);
for (int & val : tab) cin >> val;
int anss = 0;
for (int i = n - 1; i >= 0; i--) {
xorr[i] = 1;
ranks[i] = -tab[i];
if (ranks[i] < 0) ranks[i] = 0;
while (xorr[i]) {
int v = query(ranks[i] + 1, base - 1);
if (v >= n) break;
update(ranks[v], v);
graf[i].push_back(v);
xorr[i] ^= xorr[v];
}
update(ranks[i], i);
if (ranks[i] == 0 && xorr[i] && !anss) anss = tab[i];
}
for (int i = 0; i < n - 1; i++) cout << n << '\n';
cout << anss << '\n';
return 0;
}