Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- int inf_int=1e8;
- ll inf_ll=1e17;
- typedef pair<int,int> pii;
- typedef pair<ll,ll> pll;
- #define pb push_back
- const double pi=3.1415926535898;
- #define dout if(debug) cout
- #define fi first
- #define se second
- #define sp setprecision
- #define mp make_pair
- #define siz(a) a.size()
- #define sz size()
- const ll mod = 1e9+9;
- const int MAXN =1e6+10;
- bool debug = false;
- typedef long double dbl;
- int n, maxi, tot;
- vector < pair <int, int> > q;
- vector <int> g[111111];
- int ans[111111];
- void solve()
- {
- cin >> n;
- for (int i = 1; i <= n; i++)
- {
- int l;
- cin >> l;
- // q[i].fi = l;
- // q[i].se = i;
- g[l].pb(i);
- maxi = max(maxi,l);
- }
- //sort (q+1,q+n+1);
- //reverse(q+1,q+n+1);
- if (maxi % 2)
- {
- for (int i = maxi; i >= maxi/2; i--)
- {
- if (siz(g[i]) < 2)
- {
- cout << "Epic fail";
- return;
- }
- tot += siz(g[i]);
- }
- int tmp = (maxi+1)/2;
- if (siz(g[tmp]) != 2 || tot != n)
- {
- cout << "Epic fail";
- return;
- }
- int last = g[maxi][siz(g[maxi])-1];
- g[maxi].pop_back();
- for (int i = maxi - 1; i >= maxi/2; i--)
- {
- int need = g[i][siz(g[i])-1];
- g[i].pop_back();
- q.pb(mp(last,need));
- ans[i] = need;
- last = need;
- }
- for (int i = tmp; i <= maxi; i++)
- {
- int need = g[i][siz(g[i])-1];
- g[i].pop_back();
- q.pb(mp(last,need));
- last = need;
- }
- for (int i = maxi; i > tmp; i--)
- {
- while (!(g[i].empty()))
- {
- int need = g[i][siz(g[i])-1];
- g[i].pop_back();
- q.pb(mp(ans[i-1],need));
- }
- }
- cout << "I got it" << endl;
- for (int i = 0; i < q.sz; i++)
- {
- cout << q[i].fi << " " << q[i].se << endl;
- }
- return;
- }
- else
- {
- cout << "@";
- for (int i = maxi; i >= maxi/2; i--)
- {
- if (siz(g[i]) < 2)
- {
- cout << "Epic fail";
- cout << "!";
- return;
- }
- tot += siz(g[i]);
- }
- int tmp = maxi/2;
- if (siz(g[tmp]) != 2 || tot != n)
- {
- cout << "Epic fail";
- return;
- }
- int last = g[maxi][siz(g[maxi])-1];
- g[maxi].pop_back();
- for (int i = maxi - 1; i >= maxi/2; i--)
- {
- int need = g[i][siz(g[i])-1];
- g[i].pop_back();
- q.pb(mp(last,need));
- ans[i] = need;
- last = need;
- }
- for (int i = tmp+1; i <= maxi; i++)
- {
- int need = g[i][siz(g[i])-1];
- g[i].pop_back();
- q.pb(mp(last,need));
- last = need;
- }
- for (int i = maxi; i > tmp; i--)
- {
- while (!(g[i].empty()))
- {
- int need = g[i][siz(g[i])-1];
- g[i].pop_back();
- q.pb(mp(ans[i-1],need));
- }
- }
- cout << "I got it" << endl;
- for (int i = 0; i < q.sz; i++)
- {
- cout << q[i].fi << " " << q[i].se << endl;
- }
- return;
- }
- }
- #define FILE "decode"
- int main()
- {
- #ifdef zxc
- freopen("input.txt","r",stdin);
- // freopen("output.txt","w",stdout);
- #else
- freopen(FILE".in","r",stdin);
- freopen(FILE".out","w",stdout);
- #endif // zxc
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- int t=1;
- while(t--)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment