Cod sursa(job #2086902)

Utilizator alexandruilieAlex Ilie alexandruilie Data 12 decembrie 2017 17:44:13
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#define nmax 50001
using namespace std;
ifstream f("concurs1.in");
ofstream g("concurs1.out");
int arb[4*nmax],j,n,i,x,ok=1,sol[nmax];
void adaug(int poz,int val,int nod,int a,int b)
{
    if(a==b) arb[nod]=val;
    else
    {
    int mij=(a+b)/2;
    if(poz<=mij) adaug(poz,val,2*nod,a,mij);
    else adaug(poz,val,2*nod+1,mij+1,b);
    arb[nod]=arb[2*nod]+arb[2*nod+1];
    }
}
void scad(int poz,int val,int nod,int a,int b)
{
    if(a==b) {
            arb[nod]+=val;sol[i]=a;}
    else{
    int mij=(a+b)/2;
    if(poz>arb[nod]) {ok=0;g<<"NU ARE SOLUTIE";return;}
    if(poz<=arb[2*nod]) scad(poz,val,2*nod,a,mij);
    else scad(poz-arb[2*nod],val,2*nod+1,mij+1,b);
    arb[nod]+=val;
    }
}
int main()
{
    f>>n;
    for(i=1;i<=n;i++) adaug(i,1,1,1,n);

        /*for(j=1;j<2*n;j++) g<<arb[j]<<' ';
        g<<'\n';*/
    for(i=1;i<=n&&ok;i++)
    {
        f>>x;
        scad(x+1,-1,1,1,n);
      /*  for(j=1;j<2*n;j++) g<<arb[j]<<' ';
        g<<'\n';*/
    }
    if(ok)
    for(i=1;i<=n;i++) g<<sol[i]<<' ';
    return 0;
}