Submission #447601

#TimeUsernameProblemLanguageResultExecution timeMemory
447601blueLong Mansion (JOI17_long_mansion)C++17
10 / 100
3076 ms26948 KiB
#include <iostream>
#include <set>
#include <vector>
using namespace std;

int main()
{
    int N;
    cin >> N;

    int C[N+1];
    for(int i = 1; i < N; i++) cin >> C[i];

    set<int> keys[N+1];
    for(int i = 1; i <= N; i++)
    {
        int B;
        cin >> B;

        for(int j = 1; j <= B; j++)
        {
            int A;
            cin >> A;
            keys[i].insert(A);
        }
    }


    vector<int> left_reach(1+N), right_reach(1+N);

    for(int i = 1; i <= N; i++)
    {
        left_reach[i] = right_reach[i] = i;
        set<int> curr_keys;
        for(int k: keys[i]) curr_keys.insert(k);

        while(1)
        {
            if(left_reach[i] != 1 && curr_keys.find( C[ left_reach[i]-1 ]) != curr_keys.end() )
            {
                left_reach[i]--;
                for(int k: keys[ left_reach[i] ]) curr_keys.insert(k);
            }
            else if(right_reach[i] != N && curr_keys.find( C[ right_reach[i] ] ) != curr_keys.end())
            {
                right_reach[i]++;
                for(int k: keys[ right_reach[i] ]) curr_keys.insert(k);
            }
            else break;
        }
    }



    int Q;
    cin >> Q;
    for(int q = 1; q <= Q; q++)
    {
        int x, y;

        cin >> x >> y;

        if(left_reach[x] <= y && y <= right_reach[x])
        {
            cout << "YES\n";
        }
        else cout << "NO\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...