Submission #147760

#TimeUsernameProblemLanguageResultExecution timeMemory
147760theboatmanHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
30 / 100
1542 ms65128 KiB
#include <bits/stdc++.h>

#define y1 theboatman
#define make_struct(args...) {args}

using namespace std;

typedef long long ll;

const long long INF = 1e18 + 10;
const int inf = 1e9 + 10;
const int N = 1e6 + 10;

struct osu {
    int l, r, k;
};

struct group3 {
    struct node {
        int ok, l, r;
    };

    int n, tl, tr, v;
    vector <node> t;

    void init(int _n) {
        n = _n;

        v = 1;
        tl = 0;
        tr = n - 1;

        t.resize(n * 4);
    }

    node combine(node a, node b) {
        node res;

        res.ok = (a.ok & b.ok);
        res.ok &= (a.r <= b.l);

        res.l = a.l;
        res.r = b.r;

        return res;
    }

    void build(int v, int tl, int tr, vector <int> &a) {
        if (tl == tr) {
            t[v] = make_struct(1, a[tl], a[tr]);
        }
        else {
            int tm = (tl + tr) / 2;
            build(v * 2, tl, tm, a);
            build(v * 2 + 1, tm + 1, tr, a);

            t[v] = combine(t[v * 2], t[v * 2 + 1]);
        }
    }

    void build(vector <int> &a) {
        build(v, tl, tr, a);
    }

    node get(int v, int tl, int tr, int l, int r) {
        if (l > r) {
            return make_struct(-1, -1, -1);
        }

        if (tl == l && tr == r) {
            return t[v];
        }

        int tm = (tl + tr) / 2;
        node ql = get(v * 2, tl, tm, l, min(r, tm));
        node qr = get(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);

        if (ql.ok == -1) {
            return qr;
        }

        if (qr.ok == -1) {
            return ql;
        }

        return combine(ql, qr);
    }

    int get(int l, int r) {
        return get(v, tl, tr, l, r).ok;
    }
};

vector <int> lg;
vector <vector <int> > table;

int get(int l, int r) {
    int len = (r - l + 1);
    len = lg[len];

    return max(table[len][r], table[len][l + (1 << len) - 1]);
}

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

    int n, m;
    cin >> n >> m;

    vector <int> a(n);
    for(auto &i : a) {
        cin >> i;
    }

    int flag = 1;
    int mn = *min_element(a.begin(), a.end());

    vector <osu> b(m);
    for(auto &i : b) {
        cin >> i.l >> i.r >> i.k;
        i.l--, i.r--;

        flag &= (i.k < mn);
    }

    if (flag) {
        group3 str;

        str.init(n);
        str.build(a);

        for(auto &i : b) {
            cout << str.get(i.l, i.r) << "\n";
        }
    }
    else {
        lg.resize(n + 1);
        int st = 1, res = 0;

        for(int i = 1; i <= n; i++) {
            lg[i] = res;

            if (i >= st * 2) {
                st *= 2;
                res++;
            }
        }

        table.resize(20, vector <int> (n));
        for(int st = 0; st < 20; st++) {
            if (!st) {
                for(int i = 0; i < n; i++) {
                    table[st][i] = a[i];
                }
            }
            else {
                for(int i = 0; i < n; i++) {
                    int l = i - (1 << (st - 1));

                    if (l >= 0) {
                        table[st][i] = max(table[st - 1][l], table[st - 1][i]);
                    }
                }
            }
        }

        if (n <= 5000 && m <= 5000) {
            for(auto i : b) {
                int flag = 1;
                for(int j = i.l; j <= i.r; j++) {
                    int mx = get(i.l, j);

                    if (mx > a[j]) {
                        flag &= (mx + a[j] <= i.k);
                    }
                }

                cout << flag << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...