#include "souvenirs.h"
#include <bits/stdc++.h>
#include <utility>
#include <vector>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long lli;
typedef vector<int> vi;
typedef pair<vi, lli> vil;
lli p[105], q[105], m[105];
void buy_souvenirs(int N, long long P0) {
    memset(p, 0, sizeof p);
    memset(q, 0, sizeof q);
    memset(m, 0, sizeof m);
    int left = 1, right = N - 1, k = 0;
    stack<vil> s;
    p[0] = m[0] = P0;
    while (left <= right) {
        lli c = m[k] - 1;
        vil res = transaction(c);
        for (int t : res.fi) {
            q[t]++;
        }
        c -= res.se;
        while (1) {
            vi v;
            int sz = 0;
            lli all_diffs = 0;
            for (int t : res.fi) {
                if (p[t] == 0) {
                    v.pb(t);
                    sz++;
                    all_diffs += (t - v[0]);
                } else {
                    c -= p[t];
                }
            }
            k = max(k, v[0]);
            if (sz > 1) {
                s.push(mp(v, c));
                m[v[0]] = (c + all_diffs + sz - 1) / sz;
                break;
            }
            p[v[0]] = m[v[0]] = c;
            if (s.empty()) {
                break;
            }
            res = s.top();
            s.pop();
            c = res.se;
        }
        while (p[left] != 0) {
            left++;
        }
        while (p[right] != 0) {
            right--;
        }
        while ((k >= right) || (m[k] == 0)) {
            k--;
        }
    }
    for (int i = 1; i < N; i++) {
        while (q[i] < i) {
            transaction(p[i]);
            q[i]++;
        }
    }
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |