Submission #1304324

#TimeUsernameProblemLanguageResultExecution timeMemory
1304324domiTrading (IZhO13_trading)C++20
100 / 100
208 ms18560 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "Yes" << endl; return; }
#define NO { cout << "No" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int NMAX = 3e5;

using namespace std;

int n, m;

struct Seg {
    int aint[4 * NMAX + 5];
    int lazy[4 * NMAX + 5];

    void build(int nod = 1, int st = 1, int dr = n) {
        if (st == dr) {
            aint[nod] = INT_MIN;
            lazy[nod] = INT_MIN;
            return;
        }

        int m = (st + dr) >> 1;
        build(2 * nod, st, m);
        build(2 * nod + 1, m + 1, dr);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
        lazy[nod] = INT_MIN;
    }

    void push(int nod, int st, int dr) {
        if (lazy[nod] != INT_MIN) {
            aint[nod] = max(aint[nod], lazy[nod]);
            if (st != dr) {
                lazy[2 * nod] = max(lazy[2 * nod], lazy[nod]);
                lazy[2 * nod + 1] = max(lazy[2 * nod + 1], lazy[nod]);
            }
            lazy[nod] = INT_MIN;
        }
    }

    void chmax(int l, int r, int v, int nod = 1, int st = 1, int dr = n) {
        push(nod, st, dr);

        if (st > r || dr < l) return;
        if (l <= st && dr <= r) {
            lazy[nod] = max(lazy[nod], v);
            push(nod, st, dr);
            return;
        }

        int m = (st + dr) >> 1;
        chmax(l, r, v, 2 * nod, st, m);
        chmax(l, r, v, 2 * nod + 1, m + 1, dr);
        aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
    }

    int query(int l, int r, int nod = 1, int st = 1, int dr = n) {
        push(nod, st, dr);
        if (st > r || dr < l) return INT_MIN;
        if (l <= st && dr <= r) return aint[nod];

        int m = (st + dr) >> 1;
        return max(query(l, r, 2 * nod, st, m), query(l, r, 2 * nod + 1, m + 1, dr));
    }

}aint;

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> m;

    aint.build();
    for (int i = 0, l, r, x; i < m; ++i) {
        cin >> l >> r >> x;
        aint.chmax(l, r, x - l);
    }

    for (int i = 1; i <= n; ++i) {
        int ret = aint.query(i, i);
        cout << (ret == INT_MIN ? 0 : ret + i) << " \n"[i == n];
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...