Cod sursa(job #1392282)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 18 martie 2015 15:54:24
Problema Schi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <cstdio>
#define NMAX 30023
using namespace std;
FILE *fin, *fout;
int n, v[NMAX], arb[2*NMAX], start, end, mid, ans[NMAX], aux[NMAX];
void pun(int st, int dr, int pos, int nod)
{
    if(st == dr)
    {
        arb[nod] = 1;
        return ;
    }
    int mij = (st+dr)/2;
    if(pos <=  mij) pun(st, mij, pos, 2*nod);
    if(pos > mij) pun(mij+1, dr, pos, 2*nod+1);
    arb[nod] = arb[2*nod] + arb[2*nod+1];
    return ;
}
int interogare(int st, int dr, int st1, int dr1, int nod)
{
    if(st == st1 && dr == dr1)
    {
        return arb[nod];
    }
    int mij = (st+dr)/2;
    if(dr1 <= mij) return interogare(st, mij, st1, dr1, 2*nod);
    if(st1 > mij) return interogare(mij+1, dr, st1, dr1, 2*nod+1);
    return interogare(st, mij, st1, mij, 2*nod) + interogare(mij+1, dr, mij+1, dr1, 2*nod+1);
}
void cautbin(int a)
{
    int nr;
    bool f = 0;
    while(f == 0)
    {
        mid = (start + end)/2;
        nr = mid - interogare(1, n, 1, mid, 1);
        if(a < nr)
        {
            end = mid-1;
        }
        if(a > nr)
        {
            start = mid+1;
        }
        if(a == nr)
        {
            if(aux[mid] == 1)
            {
                end = mid-1;   
            }
            else
            {
                f = 1;
            }
        }
    }
}
int main()
{
    fin = freopen("schi.in", "r", stdin);
    fout = freopen("schi.out", "w", stdout);
    scanf("%d", &n);
    for(int i = n; i>=1; i--) scanf("%d", &v[i]);
    for(int i = 1; i<= n; i++)
    {
        start = 1;
        end = n;
        mid = (start+end)/2;
        cautbin(v[i]);
        pun(1, n, mid, 1);
        aux[mid] = 1;
        ans[mid] = n-i+1;
    }
    for(int i = 1; i<= n; i++) printf("%d\n", ans[i]);
    fclose(fin);
    fclose(fout);
}