Cod sursa(job #2332288)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 30 ianuarie 2019 16:41:37
Problema Schi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <bits/stdc++.h>
#define maxn 30000
#define fi first
#define se second

using namespace std;

struct nod
{
  int loc, ind; /// pop = is populated
  pair<int,int> son;
  int upi; /// indice update
};

struct data
{
  int loc, ind;
};

vector <nod> aib;
int v[maxn+5];
vector<data> upd;

ifstream fin ( "schi.in" );
ofstream fout ( "schi.out" );

void add ( int i, int p )
{
  int sz = upd.size();
  for ( ; aib[p].upi < sz; aib[p].upi++ )
    aib[p].loc += (aib[p].ind < upd[aib[p].upi].ind && aib[p].loc >= upd[aib[p].upi].loc );

  if ( aib[p].son.fi == 0 )
  {
    if ( v[i] <= aib[p].loc )
    {
      aib[p].son.fi = aib.size();
      aib.push_back ( {v[i], i, {0,0}, sz} );
      upd.push_back ( {v[i],i} );
      return;
    }
  }
  else if ( v[i] <= aib[p].loc ) add ( i, aib[p].son.fi );

  if ( aib[p].son.se == 0 )
  {
    if ( v[i] > aib[p].loc )
    {
      aib[p].son.se = aib.size();
      aib.push_back ( {v[i], i, {0,0}, sz} );
      upd.push_back ( {v[i],i} );
      return;
    }
  }
  else if ( v[i] > aib[p].loc ) add ( i, aib[p].son.se );
}

void print ( int p )
{
  if ( aib[p].son.fi > 0 ) print ( aib[p].son.fi );
  fout << aib[p].ind << '\n';
  if ( aib[p].son.se > 0 ) print ( aib[p].son.se );
}

int main ()
{
  int n;
  fin >> n;

  int i;
  for ( i = 1; i <= n; i++ )
    fin >> v[i];

  aib.push_back ( {0, 0, {0,0}, 0} );
  aib.push_back ( {1, 1, {0,0}, 0} );

  for ( i = 2; i <= n; i++ )
    add ( i, 1 );

  print ( 1 );

  fin.close ();
  fout.close ();

  return 0;
}