Submission #1209001

#TimeUsernameProblemLanguageResultExecution timeMemory
1209001qilbyGift Exchange (JOI24_ho_t4)C++20
88 / 100
2592 ms218948 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 1000009;

struct fenwick {
    vector < int > t;

    fenwick() { t.resize(N, 0); }

    void add(int p, int x) { for (int i = p; i < N; i += (i & -i)) t[i] += x; }

    int get(int p) {
        int res = 0;
        for (int i = p; i >= 1; i -= (i & -i)) res += t[i];
        return res;
    }
};

bool res[N];
vector < array < int , 3 > > vec[N];
int n, q, a[N], b[N], lft[N], rgt[N];
vector < array < int , 2 > > t[N * 2];

void build(int v, int tl, int tr) {
    if (tl == tr) {
        t[v] = {{b[tl], a[tl]}};
        return;
    }

    int tm = (tl + tr) >> 1;
    build(v + v, tl, tm);
    build(v + v + 1, tm + 1, tr);

    int i = 0, j = 0;

    while (i < (int)t[v + v].size() || j < (int)t[v + v + 1].size()) {
        array < int , 2 > s;

        if (j >= (int)t[v + v + 1].size() || (i < (int)t[v + v].size() && t[v + v][i][1] < t[v + v + 1][j][1])) s = t[v + v][i++];
        else s = t[v + v + 1][j++];

        while (i < (int)t[v + v].size() || j < (int)t[v + v + 1].size()) {
            bool was = 0;

            if (i < (int)t[v + v].size()) {
                if (t[v + v][i][0] < s[1]) {
                    s[0] = min(s[0], t[v + v][i][0]);
                    s[1] = max(s[1], t[v + v][i][1]);
                    i++, was = 1;
                }
            }
            if (j < (int)t[v + v + 1].size()) {
                if (t[v + v + 1][j][0] < s[1]) {
                    s[0] = min(s[0], t[v + v + 1][j][0]);
                    s[1] = max(s[1], t[v + v + 1][j][1]);
                    j++, was = 1;
                }
            }

            if (!was) break;
        }

        t[v].push_back(s);
    }
}

int getf(int v, int tl, int tr, int l, int r, int lg, int rg) {
    if (tr < l || tl > r || l > r) return n + 1;

    int i = lower_bound(t[v].begin(), t[v].end(), array < int , 2 >{lg, 0}) - t[v].begin();
    if (t[v][i][1] > rg) return n + 1;

    if (tl == tr) return tl;

    int tm = (tl + tr) >> 1;
    int x = getf(v + v, tl, tm, l, r, lg, rg);

    if (x != n + 1) return x;
    return getf(v + v + 1, tm + 1, tr, l, r, lg, rg);
}

int getl(int v, int tl, int tr, int l, int r, int lg, int rg) {
    if (tr < l || tl > r || l > r) return 0;

    int i = lower_bound(t[v].begin(), t[v].end(), array < int , 2 >{lg, 0}) - t[v].begin();
    if (t[v][i][1] > rg) return 0;

    if (tl == tr) return tl;

    int tm = (tl + tr) >> 1;
    int x = getl(v + v + 1, tm + 1, tr, l, r, lg, rg);

    if (x != 0) return x;
    return getl(v + v, tl, tm, l, r, lg, rg);
}

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

    cin >> n;

    for (int i = 1; i <= n; i++) cin >> a[i];

    for (int i = 1; i <= n; i++) cin >> b[i];

    build(1, 1, n);

    for (int i = 1; i <= n * 4; i++) for (auto &pr : t[i]) swap(pr[0], pr[1]);
    for (int i = 1; i <= n * 4; i++) if (!t[i].empty()) t[i].push_back({(int)1e9, (int)1e9});

    for (int i = 1; i <= n; i++) {
        lft[i] = getl(1, 1, n, 1, i - 1, b[i], a[i]);
        rgt[i] = getf(1, 1, n, i + 1, n, b[i], a[i]);
        vec[lft[i] + 1].push_back({i, 0, rgt[i] - 1});
        vec[i + 1].push_back({i, -2, rgt[i] - 1});
    }

    cin >> q;

    for (int i = 1; i <= q; i++) {
        int l, r;
        cin >> l >> r;
        vec[l].push_back({r, i, 0});
    }

    fenwick f;

    for (int i = 1; i <= n; i++) {
        for (auto arr : vec[i]) {
            if (arr[1] < 1) f.add(arr[0], arr[1] + 1), f.add(arr[2] + 1, -arr[1] - 1);
            else {
                int x = f.get(arr[0]);
                if (x > 0) res[arr[1]] = 1;
            }
        }
    }

    for (int i = 1; i <= q; i++) cout << (res[i] ? "No" : "Yes") << "\n";
}

/*
5
3 4 6 9 10
1 2 5 7 8
3
1 5
1 2
2 4
*/
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...