Cod sursa(job #2837217)

Utilizator LuxinMatMatasaru Luxin Gabriel LuxinMat Data 21 ianuarie 2022 21:52:26
Problema Schi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
using namespace std;

ifstream cin("schi.in");
ofstream cout("schi.out");

int n, aib[30001], v[30001], rez[30001];

void update(int pos, int val)
{
    for(int i=pos; i<=n; i+=(i&(-i)))
        aib[i] += val;
}

int query(int val)
{
    int rez;
    int nr = 0;
    int pos = 0;
    int pas = 1<<17;
    while(pas)
    {
        if(pos + pas <= n && nr + aib[pos+pas] < val)
        {
            pos += pas;
            nr += aib[pos];
        }
        pas >>= 1;
    }
    return pos+1;
}

int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>v[i];
        update(i, 1);
    }

    for(int i=n; i>0; i--)
    {
        for(int j=1; j<=n; j++)
            cout<<aib[j]<<" ";
        cout<<'\n';
        int pos = query(v[i]);
        rez[pos] = i;
        update(pos, -1);
    }
    for(int i=1; i<=n; i++)
        cout<<rez[i]<<'\n';
    return 0;
}

int sp[3001];

int main1()
{
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>v[i];
        sp[i] = i;
    }
    for(int i=n; i>0; i--)
    {
        int st = 1;
        int dr = n;
        int m = (st + dr)/2;
        int pos = 0;
        while(st<=dr)
        {
            m = (st + dr)/2;
            if(sp[m] < v[i])
                st = m+1;
            else if(sp[m] >= v[i])
            {
                pos = m;
                dr = m-1;
            }
        }
        rez[pos] = i;
        for(int j=pos; j<=n; j++)
            sp[j] --;
    }
    for(int i=1; i<=n; i++)
        cout<<rez[i]<<'\n';
}