Submission #576259

#TimeUsernameProblemLanguageResultExecution timeMemory
576259chonkaBitaro’s Party (JOI18_bitaro)C++17
0 / 100
5 ms5252 KiB
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int MAXN = 100007 ;
const int MAGIC = 330 ;

int n , m , q ;
vector < int > v[ MAXN ] ;
pair < int , int > ans[ MAXN ][ MAGIC ] ;
bool used[ MAXN ] ;

bool bad[ MAXN ] ;
pair < int , int > aux[ MAGIC ] ;
int ret[ MAXN ] ;

void unite ( int host , int nw ) {
    int tp = 0 ;
    int pos1 , pos2 ;
    pos1 = pos2 = 0 ;
    while ( tp < MAGIC ) {
        int cand = ans[ nw ][ pos2 ].second ;
        if ( cand >= 0 ) { ++ cand ; }
        if ( ans[ host ][ pos1 ].second >= cand ) {
            aux[ tp ++ ] = ans[ host ][ pos1 ++ ] ;
        }
        else {
            aux[ tp ++ ] = ans[ nw ][ pos2 ++ ] ;
            ++ aux[ tp - 1 ].second ;
        }
    }
    for ( int i = 0 ; i < MAGIC ; ++ i ) {
        ans[ host ][ i ] = aux[ i ] ;
    }
}

void init ( int vertex ) {
    used[ vertex ] = true ;
    for ( int i = 0 ; i < MAGIC ; ++ i ) {
        ans[ vertex ][ i ] = { 0 , -1 } ;
    }
    ans[ vertex ][ 0 ] = { vertex , 0 } ;
    for ( auto x : v[ vertex ] ) {
        if ( used[ x ] == false ) {
            init ( x ) ;
        }
        unite ( vertex , x ) ;
    }
}

void dfs ( int vertex ) {
    used[ vertex ] = true ;
    ret[ vertex ] = -1 ;
    if ( used[ vertex ] == false ) { ret[ vertex ] = 0 ; }
    for ( auto x : v[ vertex ] ) {
        if ( used[ x ] == false ) {
            dfs ( x ) ;
        }
        if ( ret[ x ] >= 0 ) {
            ret[ vertex ] = max ( ret[ vertex ] , ret[ x ] + 1 ) ;
        }
    }
}

void input ( ) {
    cin >> n >> m >> q ;
    for ( int x , y , i = 1 ; i <= m ; ++ i ) {
        cin >> x >> y ;
        v[ y ].push_back ( x ) ;
    }
}

int hh[ MAXN ] ;

void solve ( ) {
    for ( int i = n ; i >= 1 ; -- i ) {
        if ( used[ i ] == false ) {
            init ( i ) ;
        }
    }
    while ( q -- ) {
        int ori , sz ;
        cin >> ori >> sz ;
        for ( int i = 0 ; i < sz ; ++ i ) {
            cin >> hh[ i ] ;
            bad[ hh[ i ] ] = true ;
        }
        if ( sz < MAGIC ) {
            bool fl = false ;
            for ( int i = 0 ; i < MAGIC ; ++ i ) {
                if ( bad[ ans[ ori ][ i ].first ] == false ) {
                    fl = true ;
                    cout << ans[ ori ][ i ].second << "\n" ;
                    break ;
                }
            }
            if ( fl == false ) { cout << "-1\n" ; }
        }
        else {
            for ( int i = 1 ; i <= n ; ++ i ) {
                used[ i ] = false ;
            }
            dfs ( ori ) ;
            cout << ret[ ori ] << "\n" ;
        }
        for ( int i = 0 ; i < sz ; ++ i ) {
            bad[ hh[ i ] ] = false ;
        }
    }
}

int main ( ) {
    /// freopen ( "in.txt" , "r" , stdin ) ;
    ios_base :: sync_with_stdio ( false ) ;
    cin.tie ( NULL ) ;
    int t ;
    /// cin >> t ;
    t = 1 ;
    while ( t -- ) {
        input ( ) ;
        solve ( ) ;
    }
    return 0 ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...