func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   ostream& operator<<(ostream& os, vector<T> V) {     os <<  [  ;     for (auto v : V) os << v <<    ;     os <<  ] ;     return os;   }   template <class T>   ostream& operator<<(ostream& os, set<T> second) {     os <<  {  ;     for (auto s : second) os << s <<    ;     return os <<  } ;   }   template <class T>   ostream& operator<<(ostream& os, multiset<T> second) {     os <<  {  ;     for (auto s : second) os << s <<    ;     return os <<  } ;   }   template <class L, class R>   ostream& operator<<(ostream& os, pair<L, R> P) {     return os <<  (  << P.first <<  ,  << P.second <<  ) ;   }   template <class L, class R>   ostream& operator<<(ostream& os, map<L, R> M) {     os <<  {  ;     for (auto m : M) os <<  (  << m.first <<  :  << m.second <<  )  ;     return os <<  } ;   }   template <class L, class R>   ostream& operator<<(ostream& os, unordered_map<L, R> M) {     os <<  {  ;     for (auto m : M) os <<  (  << m.first <<  :  << m.second <<  )  ;     return os <<  } ;   }   const long long N = 200010, M = 1e9 + 7;   long long n, a[N];   vector<long long> f[N], sol;   void solve() {     cin >> n;     for (long long i = 0; i < n; i++) cin >> a[i];     for (long long i = 0; i < n; i++) f[a[i]].push_back(i + 1);     sol = vector<long long>(0);     long long minus = 0;     for (long long i = 0; i < n; i++) {       long long h = i - minus;       while (h >= 0 && f[h].size() == 0) h -= 3, minus += 3;       if (h < 0) {         cout <<  Impossible n ;         return;       }       sol.push_back(f[h].back());       f[h].pop_back();     }     cout <<  Possible n ;     for (long long it : sol) cout << it <<    ;     cout <<   n ;   }   int main() {     ios::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(0);     solve();     return 0;   }   