Submission #309365

#TimeUsernameProblemLanguageResultExecution timeMemory
309365nicolaalexandraBall Machine (BOI13_ballmachine)C++14
100 / 100
603 ms25464 KiB
#include <bits/stdc++.h>
#define DIM 100010
using namespace std;

vector <int> L[DIM];
set <int> s;
int v[DIM],dp[DIM],poz[DIM],stramos[22][DIM],f[DIM];
int n,q,i,j,x,k,rad,tip;

void dfs (int nod){
    dp[nod] = nod;
    for (auto vecin : L[nod]){
        dfs (vecin);
        dp[nod] = min (dp[nod],dp[vecin]);
    }
}

void dfs2 (int nod){
    for (auto vecin : L[nod])
        dfs2 (vecin);
    v[++k] = nod;
}


inline int cmp (int a, int b){
    return dp[a] < dp[b];
}

int main (){

    //ifstream cin ("date.in");
    //ofstream cout ("date.out");

    cin>>n>>q;
    for (i=1;i<=n;i++){
        cin>>x;
        if (!x)
            rad = i;
        else {
            L[x].push_back(i);
            stramos[0][i] = x;
        }
    }

    dfs (rad);

    for (i=1;i<=n;i++)
        sort (L[i].begin(),L[i].end(),cmp);

    dfs2 (rad);

    for (i=1;(1<<i)<=n;i++)
        for (j=1;j<=n;j++)
            stramos[i][j] = stramos[i-1][stramos[i-1][j]];

    /// tin un set cu nodurile libere
    for (i=1;i<=n;i++){
        s.insert(i);
        poz[v[i]] = i;
    }

    for (;q--;){
        cin>>tip>>x;
        if (tip == 1){ /// adaug x bile
            int sol;
            for (i=1;i<=x;i++){
                sol = v[*s.begin()];
                f[sol] = 1;
                s.erase(s.begin());
            }
            cout<<sol<<"\n";

        } else {
            int sol = 0;
            for (i=20;i>=0;i--){
                if (stramos[i][x] && f[stramos[i][x]]){
                    x = stramos[i][x];
                    sol += (1<<i);
                }
            }

            f[x] = 0;
            s.insert(poz[x]);

            cout<<sol<<"\n";

        }
    }

    return 0;
}

Compilation message (stderr)

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:71:24: warning: 'sol' may be used uninitialized in this function [-Wmaybe-uninitialized]
   71 |             cout<<sol<<"\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...