func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MAXN = 1e6 + 5;   int tree[4 * MAXN], n, m, a[MAXN], size = 0, less1[MAXN];   vector<int> del, nums;   void initialize(int l, int r, int node) {     tree[node] = r - l + 1;     if (r == l) return;     int mid = (l + r) / 2;     initialize(l, mid, 2 * node);     initialize(mid + 1, r, 2 * node + 1);   }   int elim(int node) {     while (node >= 1) {       tree[node]--;       node /= 2;     }   }   void find(int l, int r, int sum, int node) {     if (l == r) {       nums[l] = -2;       elim(node);       return;     }     int mid = (l + r) / 2;     if (tree[2 * node] >= sum)       find(l, mid, sum, 2 * node);     else       find(mid + 1, r, sum - tree[2 * node], 2 * node + 1);   }   int main() {     ios_base::sync_with_stdio(0);     cin >> n >> m;     for (int i = 0; i < m; ++i) {       cin >> a[i];     }     for (int i = 0; i < MAXN; ++i) less1[i] = 0;     for (int i = 0; i < m - 1; ++i)       for (int k = a[i]; k < a[i + 1]; ++k) less1[k] = i + 1;     for (int i = a[m - 1]; i < MAXN; ++i) less1[i] = m;     for (int i = 0; i < n; ++i) {       int x;       cin >> x;       if (x == -1) {         del.push_back(less1[size]);         size -= less1[size];       } else {         nums.push_back(x);         size++;       }     }     if (nums.size() == 0) {       cout <<  Poor stack!  << endl;       return 0;     }     initialize(0, nums.size() - 1, 1);     for (int i = 0; i < del.size(); ++i)       for (int j = del[i] - 1; j >= 0; --j) find(0, nums.size() - 1, a[j], 1);     int ct = 0;     for (int i = 0; i < nums.size(); ++i) {       if (nums[i] != -2) {         cout << nums[i];         ++ct;       }     }     if (ct == 0) cout <<  Poor stack! ;     cout << endl;   }   