Submission #1274073

#TimeUsernameProblemLanguageResultExecution timeMemory
1274073MisterReaperGift Exchange (JOI24_ho_t4)C++20
100 / 100
902 ms86752 KiB
// File giftexc.cpp created on 29.09.2025 at 08:38:31
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int inf = 1 << 30;

#define def int mid = (l + r) >> 1, lv = v + 1, rv = v + ((mid - l + 1) << 1)

struct segtree {
    struct node {
        int val;
        int lz;
        node(int val_ = 0, int lz_ = inf) : val(val_), lz(lz_) {}
        void modify(int x) {
            val = x;
            lz = x;
        }
    };
    node unite(const node& lhs, const node& rhs) {
        node res;
        res.val = std::max(lhs.val, rhs.val);
        return res;
    }
    int n;
    std::vector<node> tree;
    segtree(int n_) : n(n_), tree(n << 1) {}
    void push(int v, int l, int r) {
        def;
        if (tree[v].lz != inf) {
            tree[lv].modify(tree[v].lz);
            tree[rv].modify(tree[v].lz);
            tree[v].lz = inf;
        }
    }
    void modify(int v, int l, int r, int ql, int qr, int x) {
        if (ql == l && r == qr) {
            tree[v].modify(x);
            return;
        }
        def;
        push(v, l, r);
        if (qr <= mid) {
            modify(lv, l, mid, ql, qr, x);
        } else if (mid + 1 <= ql) {
            modify(rv, mid + 1, r, ql, qr, x);
        } else {
            modify(lv, l, mid, ql, mid, x);
            modify(rv, mid + 1, r, mid + 1, qr, x);
        }
        tree[v] = unite(tree[lv], tree[rv]);
    }
    void modify(int l, int r, int x) {
        modify(0, 0, n - 1, l, r, x);
    }
    int get(int v, int l, int r, int ql, int qr) {
        if (ql == l && r == qr) {
            return tree[v].val;
        }
        def;
        push(v, l, r);
        if (qr <= mid) {
            return get(lv, l, mid, ql, qr);
        } else if (mid + 1 <= ql) {
            return get(rv, mid + 1, r, ql, qr);
        } else {
            return std::max(get(lv, l, mid, ql, mid),
                            get(rv, mid + 1, r, mid + 1, qr));
        }
    }
    int get(int l, int r) {
        return get(0, 0, n - 1, l, r);
    }
};

struct fenwick {
    int n;
    std::vector<int> tree;
    fenwick(int n_) : n(n_), tree(n + 1) {}
    void modify(int p, int x) {
        for (p += 1; p <= n; p += p & -p) {
            tree[p] += x;
        }
    }
    void modify(int l, int r, int x) {
        modify(l, x);
        modify(r + 1, -x);
    }
    int get(int p) {
        int res = 0;
        for (p += 1; p; p -= p & -p) {
            res += tree[p];
        }
        return res;
    }
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N;
    std::cin >> N;

    std::vector<int> A(N), B(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> A[i];
        --A[i];
    }
    for (int i = 0; i < N; ++i) {
        std::cin >> B[i];
        --B[i];
    }

    std::vector<int> S(N), T(N);
    {
        segtree seg(2 * N);
        seg.modify(0, 2 * N - 1, -1);
        for (int i = 0; i < N; ++i) {
            S[i] = seg.get(B[i], A[i]);
            seg.modify(B[i], A[i], i);
        }
    }
    {
        segtree seg(2 * N);
        seg.modify(0, 2 * N - 1, -N);
        for (int i = N - 1; i >= 0; --i) {
            T[i] = -seg.get(B[i], A[i]);
            seg.modify(B[i], A[i], -i);
        }
    }

    int Q;
    std::cin >> Q;

    std::vector<int> ans(Q);
    std::vector<std::array<int, 2>> qry(Q);
    for (int i = 0; i < Q; ++i) {
        int L, R;
        std::cin >> L >> R;
        --L, --R;
        qry[i] = {L, R};
    }

    std::vector<std::vector<int>> add(N + 1), del(N + 1), ask(N + 1);
    for (int i = 0; i < N; ++i) {
        add[S[i] + 1].emplace_back(i);
        del[i].emplace_back(i);
    }
    for (int i = 0; i < Q; ++i) {
        ask[qry[i][0]].emplace_back(i);
    }

    fenwick fen(2 * N);
    for (int i = 0; i <= N; ++i) {
        for (auto j : add[i]) {
            fen.modify(j, T[j] - 1, +1);
        }
        for (auto j : ask[i]) {
            ans[j] = fen.get(qry[j][1]) == 0;
        }
        for (auto j : del[i]) {
            fen.modify(j, T[j] - 1, -1);
        }
    }

    for (int i = 0; i < Q; ++i) {
        std::cout << (ans[i] ? "Yes" : "No") << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...