/* -*- coding: utf-8 -*- * * 1051.cc: No.1051 PQ Permutation - yukicoder */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; /* constant */ const int MAX_N = 200000; /* typedef */ typedef set si; /* global variables */ int as[MAX_N], bs[MAX_N]; si aset; /* subroutines */ inline void setpos(int a, int x, int p, int q, int &px, int &qx) { if (a == p) px = x; else if (a == q) qx = x; } /* main */ int main() { int n, p, q; scanf("%d%d%d", &n, &p, &q); p--, q--; int px, qx; for (int i = 0; i < n; i++) { scanf("%d", as + i); as[i]--; setpos(as[i], i, p, q, px, qx); } //printf("px=%d, qx=%d\n", px, qx); int k = n - 1; for (; k < n;) { if (k < 0) { puts("-1"); return 0; } si::iterator sit = aset.upper_bound(as[k]); if (sit != aset.end() && *sit == q && px > k) sit++; if (sit != aset.end() && (px <= qx || q == as[k])) { int t = *sit; aset.erase(sit); setpos(t, k, p, q, px, qx); if (as[k] >= 0) { aset.insert(as[k]); setpos(as[k], n, p, q, px, qx); } as[k++] = t; } else { aset.insert(as[k]); setpos(as[k], n, p, q, px, qx); as[k--] = -1; } } //printf("k=%d, px=%d, qx=%d\n", k, px, qx); for (int i = 0; i < n; i++) { if (i) putchar(' '); printf("%d", as[i] + 1); } putchar('\n'); return 0; }