Submission #1235824

#TimeUsernameProblemLanguageResultExecution timeMemory
1235824MarwenElarbiLong Mansion (JOI17_long_mansion)C++20
0 / 100
1 ms2368 KiB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const int nax=5e5+5;
int lst[nax];
int main() {
    #ifndef ONLINE_JUDGE
        freopen("input.txt","r",stdin);
        freopen("output.txt","w",stdout);
    #endif
    int n;
    cin>>n;
    vector<int> tab[2*n];
    for (int i = 0; i < n-1; ++i)
    {
        int x;
        cin>>x;
        tab[i*2+1].push_back(x);
    }    
    for (int i = 0; i < n; ++i)
    {
        int x;
        cin>>x;
        for (int j = 0; j < x; ++j)
        {
            int y;
            cin>>y;
            tab[i*2].push_back(y);
        }
    }
    for (int i = 0; i < nax; ++i) lst[i]=-1;
    vector <pair<pair<int,int>,int>> cnt;
    for (int i = 0; i < 2*n-1; ++i)
    {
        if(i%2){
            cnt.push_back({{i,0},lst[tab[i][0]]}); 
        }else{
            for(auto u:tab[i]) {
                lst[u]=i;
            }
        }
    }
    for (int i = 0; i < 2*n-1; ++i) lst[i]=2*n-1;
    for (int i = 2*n-2; i >= 0; --i)
    {
        if(i%2){
            cnt.push_back({{i,1},lst[tab[i][0]]}); 
        }else{
            for(auto u:tab[i]) lst[u]=i;
        }
    }
    cnt.push_back({{-1,1},2*n-1});
    cnt.push_back({{2*n-1,0},-1});
    sort(cnt.begin(),cnt.end());
    //for(auto u:cnt) cout <<u.fi.fi<<" "<<u.se<<" "<<u.fi.se<<endl;
    stack<pair<int,int>> st;
    vector<pair<int,int>> intersection;
    vector<pair<int,int>> ans(2*n);
    for (int i = 0; i < 2*n; ++i) ans[i]={-1,2*n-1};
    int lst = -1;
    for (int i = 0; i < cnt.size(); ++i)
    {
        if(cnt[i].fi.se==1) {
            st.push({cnt[i].fi.fi,cnt[i].se});
        }else{
            while(!st.empty()&&st.top().se<cnt[i].fi.fi){
                st.pop();
            }
            pair<int,int> nab={-1,-1};
            if(!st.empty()) nab=st.top();
            bool test=false;
            int y = cnt[i].fi.fi;
            //cout <<y<<endl;
            while(!st.empty()){
                while(!st.empty()&&st.top().se<cnt[i].fi.fi){
                    st.pop();
                }if(st.empty()) break;
                if(st.top().fi<cnt[i].se){
                    if(!test) nab={-1,-1};
                    break;
                }
                test=true;
                int x = y; 
                while(x > max(st.top().fi,lst) ){
                    if(x%2==0){
                        ans[x]={st.top().fi,cnt[i].fi.fi};
                    } 
                    x--;
                }
                y=x;
                intersection.push_back({st.top().fi,cnt[i].fi.fi});
                st.pop();
            }
            if(nab!=make_pair(-1,-1)){
                st.push(nab);
                lst=cnt[i].fi.fi;
            } 
        }
        
    }
    //for(auto u:intersection) cout << u.fi <<" "<<u.se<<endl;
    sort(intersection.begin(),intersection.end());
    //for(auto u:intersection) cout <<u.fi<<" "<<u.se<<endl;
    int q;
    cin>>q;
    for (int i = 0; i < q; ++i)
    {
        int l,r;
        cin>>l>>r;
        l--;r--;
        l*=2;
        r*=2;
        if(ans[l].fi<=r&&r<=ans[l].se) cout <<"YES"<<endl;
        else cout <<"NO"<<endl;
        /*int cur=lower_bound(intersection.begin(),intersection.end(),make_pair(l,0))-intersection.begin();
        cur--;
        cur=lower_bound(intersection.begin(),intersection.end(),make_pair(intersection[cur].fi,l))-intersection.begin();
        cout<< cur<<" "<<intersection[cur].fi<<" "<<intersection[cur].se<<endl;
        if(intersection[cur].fi<=r&&r<=intersection[cur].se) cout <<"YES"<<endl;
        else cout << "NO" <<endl;*/
    }
}

Compilation message (stderr)

long_mansion.cpp: In function 'int main()':
long_mansion.cpp:9:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 |         freopen("input.txt","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
long_mansion.cpp:10:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   10 |         freopen("output.txt","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...