Submission #666834

#TimeUsernameProblemLanguageResultExecution timeMemory
666834hyakupBall Machine (BOI13_ballmachine)C++17
100 / 100
202 ms23380 KiB
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

const int maxn = 100010;
const int maxk = 20;
int n, q; 

vector<int> adj[maxn], ordem;
int minimo_da_sub[maxn];

bool tem_bola[maxn];

int dp[maxn][maxk], nivel[maxn];

bool cmp( int a, int b ){
    
    return minimo_da_sub[a] < minimo_da_sub[b];
}

void dfsInit( int cur, int pai ){
    
    minimo_da_sub[cur] = cur;
    
    dp[cur][0] = pai;
    
    for( int k = 1; k < maxk; k++ ) dp[cur][k] = dp[ dp[cur][ k - 1] ][k - 1]; 
    
    for( int i = 0; i < adj[cur].size(); i++ ){
        
        int viz = adj[cur][i];
        
        if( viz == pai ) continue;
        
        nivel[viz] = nivel[cur] + 1;
        
        dfsInit(viz, cur);
        
        minimo_da_sub[cur] = min( minimo_da_sub[viz], minimo_da_sub[cur] );
    
    }
    
    sort( adj[cur].begin(), adj[cur].end(), cmp );
    
}

void criaOrdem( int cur, int pai ){
    
    for( int i = 0; i < adj[cur].size(); i++ ){
        
        int viz = adj[cur][i];
        
        if( viz == pai ) continue;
        
        criaOrdem(viz, cur);
    
    }
    
    ordem.pb(cur);
}

int quedas( int x ){
    
    int x_ = x;
    
    for( int i = maxk - 1; i >= 0; i-- ){
        if( tem_bola[ dp[x_][i] ] ){
            
            x_ = dp[x_][i];
            
        }
    }
    
    tem_bola[x_] = false;
    
    return nivel[x] - nivel[x_];
}

int main(){
    
    scanf("%d %d", &n, &q );
    
    int root;
    
    for( int i = 1; i <= n; i++ ){
        
        int x; scanf("%d", &x );
        
        if( x == 0 ){
            
            root = i;
            
            continue;
        }
        
        adj[i].pb(x);
        adj[x].pb(i);
    }
    
    dfsInit( root, root );
    
    criaOrdem( root, root );
    
    //for( int i = 0; i < n; i++ ) printf("%d ", ordem[i] );
    
    //printf("\n");
    
    for( int i = 0; i < q; i++ ){
        
        int t; scanf("%d", &t );
        
        if( t == 1 ){
            
            int k; scanf("%d", &k );
            
            int cont = 0, last;
            
            for( int i = 0; i < ordem.size(); i++ ){
                
                if( !tem_bola[ordem[i]] ){
                    
                    tem_bola[ ordem[i] ] = true;
                    cont++;
                    
                    last = ordem[i];
                    
                    if( cont == k ) break;
                }
                
            } 
            
            printf("%d\n", last );
            
        }
        else{
            
            int x; scanf("%d", &x );
            
            int qtd = quedas( x );
            
            printf("%d\n", qtd );
        }
    }
}

Compilation message (stderr)

ballmachine.cpp: In function 'void dfsInit(int, int)':
ballmachine.cpp:30:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |     for( int i = 0; i < adj[cur].size(); i++ ){
      |                     ~~^~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'void criaOrdem(int, int)':
ballmachine.cpp:50:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |     for( int i = 0; i < adj[cur].size(); i++ ){
      |                     ~~^~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:119:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |             for( int i = 0; i < ordem.size(); i++ ){
      |                             ~~^~~~~~~~~~~~~~
ballmachine.cpp:82:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |     scanf("%d %d", &n, &q );
      |     ~~~~~^~~~~~~~~~~~~~~~~~
ballmachine.cpp:88:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |         int x; scanf("%d", &x );
      |                ~~~~~^~~~~~~~~~~
ballmachine.cpp:111:21: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |         int t; scanf("%d", &t );
      |                ~~~~~^~~~~~~~~~~
ballmachine.cpp:115:25: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  115 |             int k; scanf("%d", &k );
      |                    ~~~~~^~~~~~~~~~~
ballmachine.cpp:138:25: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  138 |             int x; scanf("%d", &x );
      |                    ~~~~~^~~~~~~~~~~
ballmachine.cpp:103:14: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
  103 |     criaOrdem( root, root );
      |     ~~~~~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...