This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
using namespace std;
//const int MOD = (int) 1e9 + 7;
const int K = 2;
vector<int> mods;
struct Int {
    vector<int> val;
    Int(string s = "") {
        for (auto& mod : mods) {
            int ans = 0;
            for (auto& c : s) {
                ans = (ans * 10ll + c - '0') % mod;
            }
            val.push_back(ans);
        }
    }
    Int& operator+=(const Int& other) {
        for (int i = 0; i < (int) mods.size(); i++) {
            val[i] += other.val[i];
            if (val[i] >= mods[i]) {
                val[i] -= mods[i];
            }
        }
        return *this;
    }
    Int& operator-=(const Int& other) {
        for (int i = 0; i < (int) mods.size(); i++) {
            val[i] -= other.val[i];
            if (val[i] < 0) {
                val[i] += mods[i];
            }
        }
        return *this;
    }
    bool operator==(const Int& other) const {
        return val == other.val;
    }
    array<int, K> get() const {
        return {val[0], val[1]};
    }
};
void solve() {
//    mods = {998244353};
//    mods = {(int) 1e9 + 7, 998244353, (int) 1e9 + 13};
    mods = {(int) 1e9 + 7, 998244353};
    assert((int) mods.size() == K);
    int n;
    cin >> n;
    vector<Int> a(n);
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        a[i] = Int(s);
    }
    for (int i = n - 1; i; i--) {
        a[i] -= a[i - 1];
    }
    const int B = 500, C = n / B + 1;
    vector<vector<int>> block(C);
    vector<Int> res(C);
    vector<map<array<int, K>, int>> dp(C);
    auto rebuild = [&] (int b) {
        dp[b].clear();
        Int sum("0");
        dp[b][sum.get()] = 0;
        int cnt = 0;
        for (auto i : block[b]) {
            sum += a[i];
            dp[b][sum.get()] = ++cnt;
        }
        res[b] = sum;
    };
    block[0].push_back(0);
    rebuild(0);
    auto Rebuild = [&] () {
        vector<int> ord;
        for (auto& b : block) {
            for (auto& i : b) {
                ord.push_back(i);
            }
        }
        block.clear();
        block.resize(C);
        for (int i = 0; i < (int) ord.size(); i++) {
            block[i / B].push_back(ord[i]);
        }
        for (int i = 0; i < C; i++) {
            rebuild(i);
        }
    };
    for (int i = 1; i < n; i++) {
        Int need = a[i];
        need -= Int("1");
        for (int j = 0; ; j++) {
            if (dp[j].find(need.get()) != dp[j].end()) {
                int pos = dp[j][need.get()];
                block[j].insert(block[j].begin() + pos, i);
                rebuild(j);
                break;
            } else {
                need -= res[j];
            }
        }
        if (i % B == 0) {
            Rebuild();
        }
    }
    vector<int> ans(n), ord;
    for (auto& b : block) {
        for (auto& i : b) {
            ord.push_back(i);
        }
    }
    for (int i = 0; i < n; i++) {
        ans[ord[i]] = i;
//        root = nxt[root];
    }
    for (int i = 0; i < n; i++) {
        cout << ans[i] + 1 << " ";
    }
    cout << '\n';
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
//    cin >> t;
    while (t--) {
        solve();
    }
}
| # | 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... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |