Submission #1337775

#TimeUsernameProblemLanguageResultExecution timeMemory
1337775nguyenkhangninh99Gift Exchange (JOI24_ho_t4)C++20
88 / 100
1517 ms108008 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 5e5 + 5;
int st[8 * maxn], lazy[8 * maxn], n;
void applymx(int id, int val){
    st[id] = max(st[id], val);
    lazy[id] = max(lazy[id], val);
}
void updatemx(int id, int l, int r, int u, int v, int val){
    if(v < l || r < u) return;
    if(u <= l && r <= v) applymx(id, val);
    else{
        int mid = (l + r) / 2;
        applymx(id * 2, lazy[id]);
        applymx(id * 2 + 1, lazy[id]);
        updatemx(id * 2, l, mid, u, v, val);
        updatemx(id * 2 + 1, mid + 1, r, u, v, val);
        st[id] = max(st[id * 2], st[id * 2 + 1]);
    }
}
int getmx(int id, int l, int r, int u, int v){
    if(v < l || r < u) return 0;
    if(u <= l && r <= v) return st[id];
    else{
        applymx(id * 2, lazy[id]);
        applymx(id * 2 + 1, lazy[id]);
        int mid = (l + r) / 2;
        return max(getmx(id * 2, l, mid, u, v), getmx(id * 2 + 1, mid + 1, r, u, v));
    }
}
void applymn(int id, int val){
    st[id] = min(st[id], val);
    lazy[id] = min(lazy[id], val);
}
void updatemn(int id, int l, int r, int u, int v, int val){
    if(v < l || r < u) return;
    if(u <= l && r <= v) applymn(id, val);
    else{
        int mid = (l + r) / 2;
        applymn(id * 2, lazy[id]);
        applymn(id * 2 + 1, lazy[id]);
        updatemn(id * 2, l, mid, u, v, val);
        updatemn(id * 2 + 1, mid + 1, r, u, v, val);
        st[id] = min(st[id * 2], st[id * 2 + 1]);
    }
}
int getmn(int id, int l, int r, int u, int v){
    if(v < l || r < u) return n + 1;
    if(u <= l && r <= v) return st[id];
    else{
        applymn(id * 2, lazy[id]);
        applymn(id * 2 + 1, lazy[id]);
        int mid = (l + r) / 2;
        return min(getmn(id * 2, l, mid, u, v), getmn(id * 2 + 1, mid + 1, r, u, v));
    }
}
int bit[maxn];
int get(int p){
    int res = 0;
    for(; p; p -= p & -p) res += bit[p];
    return res;
}
signed main(){
    ios_base::sync_with_stdio(0); 
    cin.tie(0); cout.tie(0);

    cin >> n;
    vector<int> a(n + 1), b(n + 1), l(n + 1), r(n + 1);
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) cin >> b[i];

    for(int i = 1; i <= n; i++){
        l[i] = getmx(1, 1, 2 * n, b[i], a[i]);
        updatemx(1, 1, 2 * n, b[i], a[i], i);
    }
    for(int i = 0; i < 4 * maxn; i++) st[i] = lazy[i] = n + 1;

    vector<vector<pair<int, int>>> at(n + 1);
    vector<vector<int>> th(n + 1);
    for(int i = n; i >= 1; i--){
        r[i] = getmn(1, 1, 2 * n, b[i], a[i]);
        updatemn(1, 1, 2 * n, b[i], a[i], i);
        th[l[i]].push_back(i);
    }

    int q; cin >> q;
    for(int i = 1; i <= q; i++){
        int ll, rr; cin >> ll >> rr;
        at[ll].push_back({rr, i});
    }

    vector<int> ts(4 * n + 5, 0);
    
    function<void(int, int, int, int, int)> update = [&](int id, int l, int r, int pos, int val){
        if(l == r) ts[id] = val;
        else{
            int mid = (l + r) / 2;
            if(pos <= mid) update(id * 2, l, mid, pos, val);
            else update(id * 2 + 1, mid + 1, r, pos, val);
            ts[id] = max(ts[id * 2], ts[id * 2 + 1]);
        }
    };

    function<int(int, int, int, int, int)> get = [&](int id, int l, int r, int u, int v) -> int {
        if(v < l || r < u) return 0;
        if(u <= l && r <= v) return ts[id];
        int mid = (l + r) / 2;
        return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
    };

    for(int i = 1; i <= n; i++) update(1, 1, n, i, r[i]);
    
    vector<int> res(q + 1);
    for(int i = n; i >= 1; i--){
        for(int x: th[i]) update(1, 1, n, x, 0); 
        for(auto [j, id] : at[i]) res[id] = (get(1, 1, n, i, j) > j);
    }

    for(int i = 1; i <= q; i++) cout << (res[i] ? "No" : "Yes") << "\n";
}
#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...