Cod sursa(job #2698978)

Utilizator euyoTukanul euyo Data 23 ianuarie 2021 13:07:05
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
#define left( a ) (a << 1)
#define right( a ) ((a << 1) + 1)

using namespace std;

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

const int MaxN = 30002;

int x[MaxN], res[MaxN];
int sum[4 * MaxN];

void build( int node, int l, int r ) {
  int mid = (l + r) / 2;

  sum[node] = r - l + 1;
  if ( l == r ) {
	return;
  }
  build( left( node ), l, mid );
  build( right( node ), mid + 1, r );
}
int query( int node, int l, int r, int x ) {
  int mid = (l + r) / 2, q;
  
  if ( l == r ) {
	sum[node] = 0;
	return l;
  }
  if ( sum[left( node )] >= x ) {
	q = query( left( node ), l, mid, x );
  } else {
    q = query( right( node ), mid + 1, r, x - sum[left( node )] );
  }
  sum[node] = sum[left( node )] + sum[right( node )];
  return q;
}

int main() {
  int n;
  
  fin >> n;
  for ( int i = 1; i <= n; ++i ) {
	fin >> x[i];
  }
  build( 1, 1, n );
  for ( int i = n; i > 0; --i ) {
	res[query( 1, 1, n, x[i] )] = i;
  }
  for ( int i = 1; i <= n; ++i ) {
	fout << res[i] << "\n";
  }
  fin.close();
  fout.close();
  return 0;
}