Cod sursa(job #3174155)

Utilizator nicholas9onicaOnica Nicholas Andrei nicholas9onica Data 24 noiembrie 2023 13:02:37
Problema Schi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include<vector>
#include<cmath>
#include <fstream>

using namespace std;
ifstream fin("schi.in");
ofstream fout("schi.out");
vector<int>aint;
vector<int>poz;
vector<int>rezultat;
int abs_dr;
void build(int poz)
{
    if(abs_dr<=poz<2*abs_dr)
    {
        return;
    }
     aint[poz]=aint[poz*2]+aint[poz*2+1];
     build(poz*2);
     build(poz*2+1);
}
void update(int poz)
{
    if(poz==0)
    {
        return;
    }
    aint[poz]=aint[poz*2]+aint[poz*2+1];
    update(poz/2);
}
int query(int nod,int skip,int lim_st,int lim_dr)
{
    if(lim_st==lim_dr)
    {
        return lim_st;
    }
    int mij=(lim_st+lim_dr)/2;
    if(skip<=aint[nod*2])
    {
        query(nod*2,skip,lim_st,mij);
    }
    else
    {
        query(nod*2+1,skip-aint[nod*2],mij+1,lim_dr);
    }
}
int main()
{
    int poz_update;
    int n;
    fin>>n;
    int log2n=log2(n);
    log2n+=((1<<log2n)<n);
    abs_dr=(1<<log2n);
    aint.resize(abs_dr*2+1);
    poz.resize(n+1);
    rezultat.resize(n+1);
    int lim_st=abs_dr;
    int lim_dr=abs_dr*2-1;
    for(int i=lim_st+1; i<=lim_dr; i++)
    {
        aint[i]=1;
    }
       for(int i=1;i<=lim_dr;i++)
    {
        cout<<aint[i]<<" ";
    }
    cout<<"\n";
    build(1);//build
    for(int i=1;i<=lim_dr;i++)
    {
        cout<<aint[i]<<" ";
    }
    cout<<"\n";

    for(int i=1; i<=n; i++)
        fin>>poz[i];

    for(int i=n; i>=1; i--)
    {
        poz_update=query(1,poz[i],1,abs_dr);
        cout<<poz_update<<" "<<poz[i]<<" "<<i<<"\n";
        rezultat[poz_update]=i;
        aint[poz_update]=0;
        update(poz_update/2);
    }
    for(int i=1;i<=n;i++)
    {
        fout<<rezultat[i]<<"\n";
    }
}