Pagini recente » Cod sursa (job #2145729) | Cod sursa (job #2647781) | Cod sursa (job #2911626) | Cod sursa (job #3206305) | Cod sursa (job #2332288)
#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;
}