Cod sursa(job #3235140)

Utilizator RosuDragos123Rosu Dragos RosuDragos123 Data 15 iunie 2024 15:52:56
Problema Schi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f("schi.in");
ofstream g("schi.out");

const int NMAX = 30001;

int v[NMAX * 4], poz[NMAX], sol[NMAX];

int query(int node, int from, int to, int val)
{
    int sum = 0;
    if(from == to)
        return to;
    int mij = (from + to) / 2;
    if(v[node * 2] >= val)
    {
        int cat = query(node * 2, from, mij, val);
        sum += cat;
    }
    if(v[node * 2] < val)
    {
        int cat = query(node * 2 + 1, mij + 1, to, val - v[node * 2]);
        sum += cat;
    }
    return sum;
}
void update(int node, int from, int to, int pos, int val)
{
    if(from == to)
    {
        v[node] += val;
        return;
    }
    int mij = (from + to) / 2;
    if(pos <= mij)
        update(node * 2, from, mij, pos, val);
    else
        update(node * 2 + 1, mij + 1, to, pos, val);
    v[node] = v[node * 2] + v[node * 2 + 1];
}

int main()
{
    int n;
    f >> n;
    for(int i = 1; i <= n; i++)
    {
        f >> poz[i];
        update(1, 1, n, i, 1);
    }
    for(int i = n; i >= 1; i--)
    {
        int p = query(1, 1, n, poz[i]);
        update(1, 1, n, p, -1);
        sol[p] = i;
    }
    for(int i = 1; i <= n; i++)
        g << sol[i] << '\n';
    return 0;
}#include <iostream>
#include <fstream>
using namespace std;

ifstream f("schi.in");
ofstream g("schi.out");

const int NMAX = 30001;

int v[NMAX * 4], poz[NMAX], sol[NMAX];

int query(int node, int from, int to, int val)
{
    int sum = 0;
    if(from == to)
        return to;
    int mij = (from + to) / 2;
    if(v[node * 2] >= val)
    {
        int cat = query(node * 2, from, mij, val);
        sum += cat;
    }
    if(v[node * 2] < val)
    {
        int cat = query(node * 2 + 1, mij + 1, to, val - v[node * 2]);
        sum += cat;
    }
    return sum;
}
void update(int node, int from, int to, int pos, int val)
{
    if(from == to)
    {
        v[node] += val;
        return;
    }
    int mij = (from + to) / 2;
    if(pos <= mij)
        update(node * 2, from, mij, pos, val);
    else
        update(node * 2 + 1, mij + 1, to, pos, val);
    v[node] = v[node * 2] + v[node * 2 + 1];
}

int main()
{
    int n;
    f >> n;
    for(int i = 1; i <= n; i++)
    {
        f >> poz[i];
        update(1, 1, n, i, 1);
    }
    for(int i = n; i >= 1; i--)
    {
        int p = query(1, 1, n, poz[i]);
        update(1, 1, n, p, -1);
        sol[p] = i;
    }
    for(int i = 1; i <= n; i++)
        g << sol[i] << '\n';
    return 0;
}