Cod sursa(job #1760850)

Utilizator ducu34Albastroiu Radu Gabriel ducu34 Data 21 septembrie 2016 13:03:53
Problema Schi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 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>
#define MULTFOARTEMULT (1<<28)-1
using namespace std;

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

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

void populateArb(long long left, long long right, long long p)
{
    if(left == right)
    {
        arb[p] = 1;
    }
    else
    {
        long long 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(long long left, long long right, long long a, long long b, long long p)
{
    if(left == right)
    {
        arb[p] = b;
    }
    else
    {
        long long 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(long long left, long long right, long long p)
{
    if(left==right)
    {
        pos = left;
    }
    else
    {
        long long 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;
}