Submission #1297219

#TimeUsernameProblemLanguageResultExecution timeMemory
1297219AnphatRMQ (NOI17_rmq)C++20
0 / 100
2 ms1848 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define f first
#define s second
#define sz(a) ((int)(a).size())
#define all(a) (a).begin(), (a).end()
#define uni(a) sort(all(a)), (a).resize(unique(all(a)) - (a).begin())

typedef pair <int, int> ii;

const int N = 1e5 + 10;

int n, q, ans[N], lz[N << 2], t[N];
multiset <int> pos;
vector <int> fp, fv;
vector <ii> s[N];

void upd(int l, int r, int id, int u, int v, int x) {
    if (l > v || r < u) return;
    if (l >= u && r <= v) {
        lz[id] = min(lz[id], x);
        return;
    }
    int mid = (l + r) >> 1;
    upd(l, mid, id << 1, u, v, x);
    upd(mid + 1, r, id << 1 | 1, u, v, x);
}

int get(int x) {
    int l = 0, r = n - 1, id = 1, ans = 1e9;
    while (l < r) {
        int mid = (l + r) >> 1;
        ans = min(ans, lz[id]);
        if (x <= mid) {
            id = id << 1;
            r = mid;
        } else {
            id = id << 1 | 1;
            l = mid + 1;
        }
    }
    return ans;
}

void solve() {
    cin >> n >> q;
    memset(lz, 0x3f, sizeof(lz));
    for (int i = 1; i <= q; i++) {
        int l, r, x;
        cin >> l >> r >> x;
        upd(0, n - 1, 1, l, r, x);
        s[x].push_back({l, r});
    }

    for (int i = 0; i < n; i++) {
        t[i] = get(i); pos.insert(i);
        if (t[i] >= 1e9) {
            t[i] = -1;
        }
        ans[i] = -1;
    }

    bool found = 1;
    for (int i = n - 1; i >= 0; i--) {
        if (sz(s[i]) == 0)
            continue;

        int x = s[i][0].f, y = s[i][0].s;
        for (auto v : s[i]) {
            x = max(x, v.f), y = min(y, v.s);
        }

        if (x <= y) {
            auto it = pos.lower_bound(x);
            if (it == pos.end() || *it > y) {
                found = 0;
                break;
            }
            ans[*it] = i;
            pos.erase(it);
        }

        for (auto x : s[i]) {
            for (auto it = pos.lower_bound(x.f); it != pos.end() && *it <= x.s; )
                it = pos.erase(it);
        }
    }

    for (int i = 0; i < n; i++) {
        if (ans[i] == -1) {
            fp.push_back(i);
        }

        if (!sz(s[i])) {
            fv.push_back(i);
        }
    }

    sort(all(fp), [&](int x, int y){return t[x] < t[y];}); 
    sort(all(fv));

    for (int i = 0; i < sz(fv); i++) {
        if (t[fp[i]] > fv[i]) {
            found = 0;
            break;
        }
        ans[fp[i]] = fv[i];
    }

    if (found) {
        for (int i = 0; i < n; i++) {
            cout << ans[i] << ' ';
        }
        cout << '\n';
    } else {
        for (int i = 0; i < n; i++) {
            cout << -1 << ' ';
        }
        cout << '\n';
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    // freopen("a.inp", "r", stdin);
    // freopen("a.out", "w", stdout);

    int t = 1;
    // cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...