Submission #1320707

#TimeUsernameProblemLanguageResultExecution timeMemory
1320707BolatuluGift Exchange (JOI24_ho_t4)C++20
100 / 100
1636 ms210832 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double db;

#define int ll
#define all(x) (x).begin(), (x).end()
#define md ((tl + tr) >> 1)
#define TL v + v, tl, md
#define TR v + v + 1, md + 1, tr

constexpr int maxn = 1'000'007;
constexpr ll inf = 1e18 + 7;
constexpr ll M = 1e9 + 7;

int binpow(int a, int n) {
    if (n == 0)
        return 1;
    if (n & 1)
        return a * binpow(a, n - 1) % M;
    int x = binpow(a, n >> 1);
    return x * x % M;
}

const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const db eps = 0.00000000001;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int random(int l, int r) {
    return uniform_int_distribution<int>(l, r)(rng);
}

int n, a[maxn], b[maxn], q, t1[4 * maxn], t2[4 * maxn], L[maxn], R[maxn], suf[maxn], t[4 * maxn];
bool ans[maxn];
vector<pair<int, int>> d[maxn], u[maxn];
multiset<int> s[maxn];

void upd(int p, int x, bool tp, int v = 1, int tl = 1, int tr = 2 * n) {
    if (tl == tr) {
        if (tp)
            s[tl].insert(x);
        else
            s[tl].erase(s[tl].find(x));
        if (s[tl].empty())
            t[v] = inf;
        else
            t[v] = *s[tl].begin();
        return;
    }
    if (p <= md)
        upd(p, x, tp, TL);
    else
        upd(p, x, tp, TR);
    t[v] = min(t[v + v], t[v + v + 1]);
}

int get(int l, int r, int v = 1, int tl = 1, int tr = 2 * n) {
    if (tl >= l && tr <= r) {
        return t[v];
    }
    if (tl > r || l > tr) {
        return inf;
    }
    return min(get(l, r, TL), get(l, r, TR));
}

void upd1(int l, int r, int x, int v = 1, int tl = 1, int tr = 2 * n) {
    if (l > r)
        return;
    if (tl >= l && tr <= r) {
        t1[v] = max(t1[v], x);
        return;
    }
    if (tl > r || l > tr)   
        return;
    upd1(l, r, x, TL), upd1(l, r, x, TR);
}

int get1(int p, int v = 1, int tl = 1, int tr = 2 * n) {
    if (tl == tr) {
        return t1[v];
    }
    if (p <= md)    
        return max(t1[v], get1(p, TL));
    return max(t1[v], get1(p, TR));
}

void upd2(int p, int x, int v = 1, int tl = 1, int tr = 2 * n) {
    if (tl == tr) {
        t2[v] = max(t2[v], x);
        return;
    }
    if (p <= md)
        upd2(p, x, TL);
    else
        upd2(p, x, TR);
    t2[v] = max(t2[v + v], t2[v + v + 1]);
}

int get2(int l, int r, int v = 1, int tl = 1, int tr = 2 * n) {
    if (l > r)
        return 0;
    if (tl >= l && tr <= r)
        return t2[v];
    if (tl > r || l > tr)
        return 0;
    return max(get2(l, r, TL), get2(l, r, TR));
}

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

    memset(t1, 0, sizeof(t1));
    memset(t2, 0, sizeof(t2));  
    for (int i = 1; i <= n; i++) {
        L[i] = max(get1(b[i]), get2(b[i] + 1, a[i] - 1));

        upd1(b[i] + 1, a[i] - 1, i), upd2(b[i], i);
    }

    memset(t1, 0, sizeof(t1));
    memset(t2, 0, sizeof(t2));  
    for (int i = n; i >= 1; i--) {
        R[i] = n + 1 - max(get1(b[i]), get2(b[i] + 1, a[i] - 1));

        upd1(b[i] + 1, a[i] - 1, n - i + 1), upd2(b[i], n - i + 1);
    }

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

    for (int i = 1; i <= n; i++) {
        u[i].emplace_back(i, L[i]);
        u[R[i]].emplace_back(i, L[i]);
    }
    for (int i = 1; i <= n; i++) {
        for (auto [id, l] : u[i]) {
            if (id == i)
                upd(id, l, 1);
            else
                upd(id, l, 0);
        }

        for (auto [l, j] : d[i]) {
            ans[j] = get(l, i) >= l;
        }
    }
    
    for (int i = 1; i <= q; i++) {
        if (ans[i])
            cout << "Yes\n";
        else
            cout << "No\n";
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int test = 1;
    // cin >> test;
    while (test--) {
        solve();
        // cout << '\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...