Submission #1330441

#TimeUsernameProblemLanguageResultExecution timeMemory
1330441edoRMQ (NOI17_rmq)C++20
100 / 100
73 ms7288 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int inf = 1e9;

struct Seg {
    int n;
    vector<int> mx;

    Seg(int n) : n(n), mx(4 * n, -1) {}

    void updMax(int node, int start, int end, int l, int r, int v) {
        if(start > end || start > r || end < l) return;
        if(start >= l && end <= r) {
            mx[node] = max(mx[node], v);
            return;
        }
        int mid = (start + end) / 2;
        updMax(node << 1, start, mid, l, r, v);
        updMax(node << 1 | 1, mid + 1, end, l, r, v);
    }

    int find(int node, int start, int end, int v) {
        if(start == end) return mx[node];
        int mid = (start + end) / 2;
        int res = (v <= mid) ? find(node << 1, start, mid, v) : find(node << 1 | 1, mid + 1, end, v);
        return max(res, mx[node]);
    }

    void upd(int l, int r, int v) { updMax(1, 0, n - 1, l, r, v);}
    int qry(int id) { return find(1, 0, n - 1, id);}
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n, q;
    cin >> n >> q;
    vector<int> ql(q), qr(q), qv(q);
    map<int, pair<int, int>> isect;

    Seg seg(n);
    for (int i = 0; i < q; ++i) {
        cin >> ql[i] >> qr[i] >> qv[i];
        if(!isect.count(qv[i])) {
            isect[qv[i]] = {ql[i], qr[i]};
        }
        else {
            isect[qv[i]].first = max(isect[qv[i]].first, ql[i]);
            isect[qv[i]].second = min(isect[qv[i]].second, qr[i]);
        }
    }

    auto die = [&]() {
        for (int j = 0; j < n; ++j) {
            cout << -1 << " ";
        }
        exit(0);
    };       

    for (int i = 0; i < q; ++i) 
        seg.upd(ql[i], qr[i], qv[i]);

    vector<int> B(n);
    for (int i = 0; i < n; ++i) 
        B[i] = seg.qry(i);

    map<int, vector<int>> byR;
    for (int i = 0; i < n; ++i) byR[B[i]].push_back(i);

    vector<int> res(n, -1);
    vector<char> used(n, 0), taken(n, 0);
    for (auto &[ans, inter] : isect) {
        int lA = inter.first, rA = inter.second;
        if(lA > rA) die();

        auto bit = byR.find(ans);
        if(bit == byR.end()) die();

        auto& plist = bit->second;
        auto it = ranges::lower_bound(plist, lA);
        if(it == plist.end() || *it > rA) die();

        int cp = *it;
        res[cp] = ans;
        used[cp] = 1;
        taken[ans] = 1;
    }

    vector<pair<int, int>> rem_p;
    for (int i = 0; i < n; ++i) if(!used[i]) rem_p.push_back({B[i], i});
    vector<int> rem_v;
    for (int i = 0; i < n; ++i) if(!taken[i]) rem_v.push_back(i);

    sort(rem_p.rbegin(), rem_p.rend());
    sort(rem_v.rbegin(), rem_v.rend());

    for (int i = 0; i < (int)rem_p.size(); ++i) {
        if(rem_v[i] < rem_p[i].first) die();
        res[rem_p[i].second] = rem_v[i];
    }

    for (int &i : res)
        cout << i << " ";
    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...