Submission #1095818

#TimeUsernameProblemLanguageResultExecution timeMemory
1095818vladiliusGift Exchange (JOI24_ho_t4)C++17
50 / 100
2503 ms13796 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define ins insert
#define arr3 array<int, 3>

struct ST{
    vector<pii> t;
    int n;
    ST(int ns){
        n = ns;
        t.resize(4 * n);
    }
    void upd(int v, int tl, int tr, int& p, int& x){
        if (tl == tr){
            t[v] = {x, tl};
            return;
        }
        int tm = (tl + tr) / 2, vv = 2 * v;
        if (p <= tm){
            upd(vv, tl, tm, p, x);
        }
        else {
            upd(vv + 1, tm + 1, tr, p, x);
        }
        t[v] = max(t[vv], t[vv + 1]);
    }
    void upd(int p, int x){
        upd(1, 1, n, p, x);
    }
    pii get(int v, int tl, int tr, int& l, int& r){
        if (l > tr || r < tl) return {0, 0};
        if (l <= tl && tr <= r) return t[v];
        int tm = (tl + tr) / 2, vv = 2 * v;
        return max(get(vv, tl, tm, l, r), get(vv + 1, tm + 1, tr, l, r));
    }
    pii get(int l, int r){
        return get(1, 1, n, l, r);
    }
};
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n; cin>>n;
    vector<int> a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i++) cin>>a[i];
    for (int i = 1; i <= n; i++) cin>>b[i];
    
    int q; cin>>q;
    while (q--){
        int l, r; cin>>l>>r;
        vector<arr3> st;
        for (int i = l; i <= r; i++){
            st.pb({b[i], a[i], i});
        }
        sort(st.begin(), st.end());
        vector<pii> x;
        for (int i = 0; i < (int) st.size(); i++){
            x.pb({st[i][1], i + 1});
        }
        sort(x.begin(), x.end());
        ST T(n);
        vector<int> p(n + 1), xx;
        for (int i = 0; i < x.size(); i++){
            T.upd(i + 1, x[i].ss);
            p[x[i].ss - 1] = i + 1;
            xx.pb(x[i].ff);
        }
        vector<int> :: iterator it;
        set<pii> st1;
        for (int i = 0; i < st.size(); i++) st1.insert({st[i][1], i});
        bool ind = 1;
        for (int j = st.size() - 1; j >= 0; j--){
            it = lower_bound(xx.begin(), xx.end(), st[j][0]);
            int ii = (int) (it - xx.begin()) + 1;
            pii mx = max(T.get(ii, p[j] - 1), T.get(p[j] + 1, n));
            if (!mx.ff){
                bool k = (st1.find({st[j][1], j}) != st1.end());
                if (k) st1.erase({st[j][1], j});
                
                if (st1.empty()){
                    ind = 0;
                    break;
                }
                
                auto f = prev(st1.end());
                if ((*f).ff < st[j][0]){
                    ind = 0;
                    break;
                }
                T.upd(p[(*f).ss], 0);
                st1.erase(f);
                
                if (k) st1.insert({st[j][1], j});
                continue;
            }
            T.upd(mx.ss, 0);
            int t = x[mx.ss - 1].ss - 1;
            st1.erase({st[t][1], t});
            
            T.upd(p[j], 0);
        }
        
        cout<<((ind) ? "Yes" : "No")<<"\n";
    }
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:71:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |         for (int i = 0; i < x.size(); i++){
      |                         ~~^~~~~~~~~~
Main.cpp:78:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |         for (int i = 0; i < st.size(); i++) st1.insert({st[i][1], i});
      |                         ~~^~~~~~~~~~~
#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...