| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 238306 | Andrei_Cotor | Ball Machine (BOI13_ballmachine) | C++11 | 1098 ms | 17016 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
using namespace std;
int P[20][100005];
vector<int> Sons[100005];
int Val[100005],Nr[100005];
bool Ball[100005];
set<pair<int,int> > S;
void dfs(int nod)
{
    Val[nod]=nod;
    for(auto son:Sons[nod])
    {
        dfs(son);
        Val[nod]=min(Val[nod],Val[nod]);
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,q;
    cin>>n>>q;
    int root=0;
    for(int i=1; i<=n; i++)
    {
        cin>>P[0][i];
        Sons[P[0][i]].push_back(i);
        if(P[0][i]==0)
            root=i;
    }
    for(int i=1; i<=16; i++)
    {
        for(int j=1; j<=n; j++)
            P[i][j]=P[i-1][P[i-1][j]];
    }
    dfs(root);
    for(int i=1; i<=n; i++)
    {
        if(Sons[i].size()==0)
            S.insert({Val[i],i});
    }
    for(int i=1; i<=q; i++)
    {
        int tip,x;
        cin>>tip>>x;
        if(tip==1)
        {
            int rez=0;
            for(int j=1; j<=x; j++) //suma x-ilor va fi max n+q
            {
                int nod=(*S.begin()).second;
                S.erase(S.begin());
                Ball[nod]=1;
                rez=nod;
                if(nod!=root)
                {
                    int p=P[0][nod];
                    Nr[p]++;
                    if(Nr[p]==Sons[p].size())
                        S.insert({Val[p],p});
                }
            }
            cout<<rez<<"\n";
        }
        else
        {
            int rez=0;
            for(int i=16; i>=0; i--)
            {
                if(Ball[P[i][x]])
                {
                    rez+=(1<<i);
                    x=P[i][x];
                }
            }
            cout<<rez<<"\n";
            Ball[x]=0;
            if(x!=root)
            {
                int p=P[0][x];
                if(Nr[p]==Sons[p].size())
                    S.erase({Val[p],p});
                Nr[p]--;
            }
            S.insert({Val[x],x});
        }
    }
    return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
