Submission #1282703

#TimeUsernameProblemLanguageResultExecution timeMemory
1282703stefanneaguOsumnjičeni (COCI21_osumnjiceni)C++20
0 / 110
129 ms31500 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int nmax = 2e5 + 1, l2 = 17, inf = 1e9 + 7;

struct str {
    int l, r;
} v[nmax];

int up[nmax][l2 + 1];
int n;

struct AINT {
    int aint[nmax * 4];
    int lz[nmax * 4];

    /*void lazy(int nod, int st, int dr) {
        if (st != dr) {
            aint[nod * 2] += lz[nod];
            lz[nod * 2] += lz[nod];
            aint[nod * 2 + 1] += lz[nod];
            lz[nod * 2 + 1] += lz[nod];
        }
        lz[nod] = 0;
    }

    void upd(int l, int r, int val, int nod = 1, int st = 1, int dr = n) {
        lazy(nod, st, dr);
        if (dr < l || r < st) {
            return;
        }
        if (l <= st && dr <= r) {
            lz[nod] += val;
            aint[nod] += val;
            lazy(nod, st, dr);
            return;
        }
        int mid = (st + dr) / 2;
        upd(l, r, val, nod * 2, st, mid);
        upd(l, r, val, nod * 2 + 1, mid + 1, dr);
        aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
    }

    int qry(int l, int r, int nod = 1, int st = 1, int dr = n) {
        lazy(nod, st, dr);
        if (dr < l || r < st) {
            return -inf;
        }
        if (l <= st && dr <= r) {
            return aint[nod];
        }
        int mid = (st + dr) / 2;
        return max(qry(l, r, nod * 2, st, mid), qry(l, r, nod * 2 + 1, mid + 1, dr));
    }*/

    void upd(int l, int r, int val) {
        for (int i = l; i <= r; i++) {
            aint[i] += val;
        }
        /*cout << "+" << val << " " << l << " " << r << '\n';
        for (int i = 1; i <= n; i++) {
            cout << aint[i] << ' ';
        }
        cout << '\n';*/
    }

    int qry(int l, int r) {
        int ans = -inf;
        for (int i = l; i <= r; i++) {
            ans = max(ans, aint[i]);
        }
        /*cout << "? " << l << " " << r << '\n';
        for (int i = 1; i <= n; i++) {
            cout << aint[i] << ' ';
        }
        cout << '\n';*/
        return ans;
    }
} ds;

int32_t main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> v[i].l >> v[i].r;
        for (int bit = 0; bit <= l2; bit++) {
            up[i][bit] = inf;
        }
    }
    for (int bit = 0; bit <= l2; bit++) {
        up[n + 1][bit] = inf;
    }
    int j = 0;
    for (int i = 1; i <= n; i++) {
        while (j + 1 <= n && ds.qry(v[j + 1].l, v[j + 1].r) == 0) {
            j++;
            ds.upd(v[j].l, v[j].r, 1);
        }
        // cout << ds.qry()
        up[i][0] = j + 1;
        ds.upd(v[i].l, v[i].r, -1);
    }
    for (int bit = 1; bit <= l2; bit++) {
        for (int i = 1; i <= n; i++) {
            if (up[i][bit - 1] > nmax) {
                up[i][bit] = inf;
            } else {
                up[i][bit] = up[up[i][bit - 1]][bit - 1];
            }
        }
    }/*
    int q;
    cin >> q;
    while (q--) {
        int l, r;
        cin >> l >> r;
        int ans = 0;
        for (int bit = l2; bit >= 0; bit--) {
            if (up[l][bit] <= r) {
                l = up[l][bit] + 1;
                ans += (1 << bit);
            }
        }
        cout << ans + 1 << '\n';
    }*/
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...