Cod sursa(job #1760852)

Utilizator ducu34Albastroiu Radu Gabriel ducu34 Data 21 septembrie 2016 13:05:00
Problema Schi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
//
//  main.cpp
//  Schi
//
//  Created by Albastroiu Radu on 9/21/16.
//  Copyright © 2016 Albastroiu Radu. All rights reserved.
//

#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

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

int i, j, n, m, tip, a, b, v[30001], rez[30001], arb[120001], Max, pos;

void populateArb(int left, int right, int p)
{
    if(left == right)
    {
        arb[p] = 1;
    }
    else
    {
        int mij = (left+right)/2;
        
        populateArb(left, mij, p*2);
        populateArb(mij+1, right, p*2+1);
        
        arb[p] = arb[p*2] + arb[p*2+1];
    }
}

void update(int left, int right, int a, int b, int p)
{
    if(left == right)
    {
        arb[p] = b;
    }
    else
    {
        int mij = (left+right)/2;
        
        if( a <= mij && a >= left  )
            update(left, mij, a, b, p*2);
        if( a >  mij && a <= right )
            update(mij+1, right, a, b, p*2+1);
        
        arb[p] = arb[p*2] + arb[p*2+1];
    }
}

void querry(int left, int right, int p)
{
    if(left==right)
    {
        pos = left;
    }
    else
    {
        int mij = (left+right)/2;
        
        if( v[i] <= arb[p*2] )
        {
            querry(left,  mij, p*2  );
        }
        else
        {
            v[i] -= arb[p*2];
            querry(mij+1, right, p*2+1);
        }
    }
}

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

    populateArb(1, n, 1);
    
    for(i=n;i>0;i--)
    {
        querry(1,n,1);
        update(1,n,pos,0,1);
        rez[pos] = i;
    }
    
    for(i=1;i<=n;i++)
        fout<<rez[i]<<"\n";
    
    return 0;
}