This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/*
    Procrastination is the art of keeping up with yesterday
*/
#include <bits/stdc++.h>
#include "robots.h"
#define pb push_back
#define fi first
#define se second
#define faster ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair <int, int>;
const int maxN = 1e6 + 1;
//const int Mod = 1e9 + 7;
int n, m, k;
int X[maxN];
int Y[maxN];
int W[maxN];
int S[maxN];
int I[maxN];
int J[maxN];
bool mark[maxN];
bool check(int mid){
    priority_queue <pii> PQ;
    int j = 1;
    fill(mark + 1, mark + k + 1, 0);
    for (int i = 1; i <= n; ++i){
        while (j <= k && W[I[j]] < X[i]){
            PQ.push({S[I[j]], I[j]});
            ++j;
        }
        for (int _ = 0; _ < mid && PQ.size(); ++_){
            mark[PQ.top().se] = 1;
            PQ.pop();
        }
    }
    j = k;
    for (int i = m; i >= 1; --i){
        int cnt = 0;
        while (j >= 1 && cnt < mid){
            if (!mark[J[j]]){
                if (S[J[j]] >= Y[i]){
                    return 0;
                }
                mark[J[j]] = 1;
                ++cnt;
            }
            --j;
        }
    }
    for (int i = 1; i <= k; ++i) if (!mark[i]) return 0;
    return 1;
}
int putaway(int A, int B, int C, int x[], int y[], int w[], int s[]){
    n = A;
    m = B;
    k = C;
    int l = 1, r = maxN;
    for (int i = 1; i <= n; ++i) X[i] = x[i - 1];
    for (int i = 1; i <= m; ++i) Y[i] = y[i - 1];
    for (int i = 1; i <= k; ++i) W[i] = w[i - 1];
    for (int i = 1; i <= k; ++i) S[i] = s[i - 1];
    for (int i = 1; i <= k; ++i) I[i] = J[i] = i;
    sort(I + 1, I + k + 1,[&](const auto &i, const auto &j){
        return W[i] < W[j];
    });
    sort(J + 1, J + k + 1,[&](const auto &i, const auto &j){
        return S[i] < S[j];
    });
    sort(X + 1, X + n + 1);
    sort(Y + 1, Y + m + 1);
    while (l < r){
        int mid = (l + r) >> 1;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    if (l == maxN) return -1;
    return l;
}
| # | 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... |