Submission #72212

#TimeUsernameProblemLanguageResultExecution timeMemory
72212cat > /dev/null (#118)Box Run (FXCUP3_box)C++17
17 / 100
61 ms3852 KiB
#include<bits/stdc++.h>
using namespace std;

const int MAX_N = 1e5;
pair<int, int> tmp[MAX_N];
int arr[MAX_N];
int res[MAX_N];

const int MAX_T = MAX_N+10;
int tree[MAX_T+1];

void update(int x, int val) {
    x = MAX_T - x - 1;
    tree[x] = val;

    for (int k = x; k <= MAX_T; k += (k & -k))
        tree[k] = max(tree[k], val);
}

int query(int x) {
    x = MAX_T - x - 1;
    int ret = -1;
    for (int k = x; k > 0; k -= (k & -k))
        ret = max(ret, tree[k]);
    return ret;
}

int main(void) {
    ios_base::sync_with_stdio(false), cin.tie(NULL);
    memset(tree, -1, sizeof tree);

    int N;  cin >> N;
    for (int i = 0; i < N; i ++) {
        cin >> arr[i];
        tmp[i].first = arr[i];
        tmp[i].second = i;
    }

    sort(tmp, tmp + N);
    int cur_idx = -1;
    int prv_val = -1;
    for (int i = 0; i < N; i ++) {
        if (prv_val != tmp[i].first) 
            cur_idx++;
        arr[tmp[i].second] = cur_idx;
        prv_val = tmp[i].first;
    }
    cur_idx ++;

    int last = 0;

    memset(res, -1, sizeof res);
    update(arr[0], 0);
    for (int i = 1; i < N; i ++) {
        if (arr[i] > arr[i-1]) { 
            int qidx = query(arr[i]);
            if (qidx != -1) {
                for (int k = qidx+1; k < i-last; k ++) 
                    res[i-k-1] = k+1;

                last = max(last, i-qidx-1);
            }
            else {
                for (; last < i; last ++)
                    res[last] = i-last;
            }
        }
        update(arr[i], i);
    }

    for (int i = 0; i < N; i ++)
        cout << res[i] << ' ';
    cout << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...