Submission #1057584

#TimeUsernameProblemLanguageResultExecution timeMemory
1057584sammyuriGift Exchange (JOI24_ho_t4)C++17
0 / 100
339 ms5720 KiB
#include <bits/stdc++.h>
using namespace std;

/*
for each index, calculate val[i],
the minimum index j > i such that they intersect
note that it is valid iff for all l, l + 1, .. , r - 1
val[i] <= r
so use a max segtree?
*/

const int MAXN = (1 << 17);
int tree[2 * MAXN];
void init() {
    for (int i = 0; i < MAXN * 2; i ++)
        tree[i] = -1;
}
void upd(int index, int value) {
    index += MAXN;
    tree[index] = value;
    index /= 2;
    while (index) {
        tree[index] = max(tree[2 * index], tree[2 * index + 1]);
        index /= 2;
    }
}
int query(int left, int right, int index, int maxl, int maxr) {
    if (left == maxl && right == maxr)
        return tree[index];
    int ans = -1;
    int mid = (maxl + maxr) / 2;
    if (left <= mid) {
        ans = max(ans, query(left, min(mid, right), 2 * index, maxl, mid));
    }
    if (right >= mid + 1) {
        ans = max(ans, query(max(mid + 1, left), right, 2 * index + 1, mid + 1, maxr));
    }
    return ans;
}
int query(int l, int r) {return query(l, r, 1, 0, MAXN - 1);}


int main() {
    int n; cin >> n;
    init();
    vector<int> aa(n), bb(n);
    for (auto &a : aa) cin >> a;
    for (auto &a : bb) cin >> a;
    // find initial values
    vector<pair<int, int>> s;
    s.push_back({0, n});
    for (int i = n - 1; i >= 0; i --) {
        // find next in line
        auto it = lower_bound(s.begin(), s.end(), (pair<int, int>){aa[i], 1e9});
        it --;
        upd(i, (*it).second);
        // remove too small ones
        while (s.back().first >= bb[i])
            s.pop_back();
        s.push_back({bb[i], i});
    }

    int q; cin >> q;
    while (q --) {
        int l, r; cin >> l >> r;
        l --; r --;
        if (l == r) {
            cout << "No" << endl; continue;
        }
        int xx = query(l, r - 1);
        if (xx <= r)
            cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    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...