Submission #752559

#TimeUsernameProblemLanguageResultExecution timeMemory
752559bgnbvnbvBall Machine (BOI13_ballmachine)C++14
100 / 100
417 ms35248 KiB
#include<bits/stdc++.h>
#define TASKNAME "codeforce"
#define pb push_back
#define pli pair<int,int>
#define fi first
#define se second
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL);
using namespace std;
using ll=long long;
const ll maxN=1e5+10;
const ll inf=1e18;
const ll mod=1e9+7;
ll val[maxN];
vector<ll>g[maxN];
ll P[maxN][18];
bool cmp(ll x,ll y)
{
    return val[x]<val[y];
}
void dfs(ll u,ll p)
{
    val[u]=u;
    for(int v:g[u])
    {
        dfs(v,u);
        val[u]=min(val[u],val[v]);
    }
    sort(g[u].begin(),g[u].end(),cmp);
}
ll pos[maxN],sz=0,h[maxN],cc[maxN];
void dfs2(ll u,ll p)
{
    P[u][0]=p;
    for(int i=1;i<=17;i++) P[u][i]=P[P[u][i-1]][i-1];
    for(int v:g[u])
    {
        h[v]=h[u]+1;
        dfs2(v,u);
    }
    pos[u]=++sz;
    cc[sz]=u;
}
ll n,st[4*maxN],lazy[4*maxN];
void down(ll id,ll l,ll r)
{
    ll &x=lazy[id];
    if(x!=0)
    {
        ll mid=l+r>>1;
        st[id*2]=(mid-l+1);
        lazy[id*2]=1;
        st[id*2+1]=r-mid;
        lazy[id*2+1]=1;
        x=0;
    }
}
void update(ll i,ll j,ll id=1,ll l=1,ll r=n)
{
    if(j<l||r<i) return;
    if(i<=l&&r<=j)
    {
        st[id]=(r-l+1);
        lazy[id]=1;
        return;
    }
    ll mid=l+r>>1;
    down(id,l,r);
    update(i,j,id*2,l,mid);
    update(i,j,id*2+1,mid+1,r);
    st[id]=st[id*2]+st[id*2+1];
}
void upd(ll p,ll id=1,ll l=1,ll r=n)
{
    if(l==r)
    {
        st[id]=0;
        return;
    }
    ll mid=l+r>>1;
    down(id,l,r);
    if(p<=mid) upd(p,id*2,l,mid);
    else upd(p,id*2+1,mid+1,r);
    st[id]=st[id*2]+st[id*2+1];
}
ll get(ll pos,ll id=1,ll l=1,ll r=n)
{
    if(l==r)
    {
        return st[id];
    }
    down(id,l,r);
    ll mid=l+r>>1;
    if(pos<=mid) return get(pos,id*2,l,mid);
    else return get(pos,id*2+1,mid+1,r);
}
ll s(ll k)
{
    ll l=1,r=n,id=1;
    while(true)
    {
        if(l==r)
        {
            return l;
        }
        down(id,l,r);
        ll mid=l+r>>1;
        if(mid-l+1-st[id*2]<k)
        {
            k-=mid-l+1-st[id*2];
            id=id*2+1;
            l=mid+1;
        }
        else
        {
            id=id*2;
            r=mid;
        }
    }
}
ll q;
ll r;
void solve()
{
    cin >> n >> q;
    for(int i=1;i<=n;i++)
    {
        ll p;
        cin >> p;
        if(p==0) r=i;
        else g[p].pb(i);
    }
    dfs(r,r);
    dfs2(r,r);
    while(q--)
    {
        ll t;
        cin >> t;
        if(t==1)
        {
            ll k;
            ll x;
            cin >> k;
            k=s(k);
            update(1,k);
            cout << cc[k]<<'\n';
        }
        else
        {
            ll u;
            cin >> u;
            ll x=u;
            for(int i=17;i>=0;i--)
            {
                if(get(pos[P[u][i]])==1) u=P[u][i];
            }
            cout <<h[x]-h[u]<<'\n';
            upd(pos[u]);
        }
    }
}
int main()
{
    fastio
    //freopen(TASKNAME".INP","r",stdin);
    //freopen(TASKNAME".OUT","w",stdout);
    solve();
}

Compilation message (stderr)

ballmachine.cpp: In function 'void down(ll, ll, ll)':
ballmachine.cpp:49:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   49 |         ll mid=l+r>>1;
      |                ~^~
ballmachine.cpp: In function 'void update(ll, ll, ll, ll, ll)':
ballmachine.cpp:66:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   66 |     ll mid=l+r>>1;
      |            ~^~
ballmachine.cpp: In function 'void upd(ll, ll, ll, ll)':
ballmachine.cpp:79:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   79 |     ll mid=l+r>>1;
      |            ~^~
ballmachine.cpp: In function 'll get(ll, ll, ll, ll)':
ballmachine.cpp:92:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   92 |     ll mid=l+r>>1;
      |            ~^~
ballmachine.cpp: In function 'll s(ll)':
ballmachine.cpp:106:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  106 |         ll mid=l+r>>1;
      |                ~^~
ballmachine.cpp: In function 'void solve()':
ballmachine.cpp:141:16: warning: unused variable 'x' [-Wunused-variable]
  141 |             ll x;
      |                ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...