Cod sursa(job #3297359)

Utilizator ana.veronica13Ana Veronica Draghici ana.veronica13 Data 22 mai 2025 15:08:00
Problema Schi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

#define MAX_N 30005

int v[MAX_N], t[4 * MAX_N], ans[MAX_N];

void build( int node, int le, int ri ){
  if( le == ri ){
    t[node] = 1;
    return;
  }
  int mid = ( le + ri ) / 2;
  build( 2 * node, le, mid );
  build( 2 * node + 1, mid + 1, ri );
  t[node] = t[2 * node] + t[2 * node + 1];
}

void update( int node, int le, int ri, int pos ){
  if( le == ri ){
    t[node] = 0;
    return;
  }
  int mid = ( le + ri ) / 2;
  if( pos <= mid )
    update( 2 * node, le, mid, pos );
  else
    update( 2 * node + 1, mid + 1, ri, pos );
  t[node] = t[2 * node + 1] + t[2 * node];
}

//vrem sa calculam cea mai mica pozitie astfel incat in intervalul [1, pos] sa avem un nr x de 1

int query( int node, int le, int ri, int x, int cnt ){
  if( le == ri ){
    return le;
  }
  int mid = ( le + ri ) / 2;
  if( t[2 * node] >= x - cnt )
    return query( 2 * node, le, mid, x, cnt );
  return query( 2 * node + 1, mid + 1, ri, x, cnt + t[2 * node] );
}

int main(){
  ifstream cin( "schi.in" );
  ofstream cout( "schi.out" );
  int n, i, pos;
  cin >> n;
  for( i = 1; i <= n; i++ )
    cin >> v[i];
  build( 1, 1, n );
  for( i = n; i > 0; i-- ){
    pos = query( 1, 1, n, v[i], 0 );
    ans[pos] = i;
    update( 1, 1, n, pos );
  }
  for( i = 1; i <= n; i++ )
    cout << ans[i] << "\n";

    return 0;
}