Cod sursa(job #35339)

Utilizator stef2nStefan Istrate stef2n Data 21 martie 2007 23:25:37
Problema Schi Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <stdio.h>

#define infile "schi.in"
#define outfile "schi.out"
#define NMAX 30002
#define DIMMAX 65600

FILE *fin,*fout;
short int sol[NMAX],v[DIMMAX];
int n;

void build(unsigned short int n, short int li, short int ls)
  {
   if(li==ls)
     {
      v[n]=1;
      return;
     }
   build(2*n,li,((int)li+ls)/2);
   build(2*n+1,((int)li+ls)/2+1,ls);
   v[n]=v[2*n]+v[2*n+1];
  }

short int cauta(unsigned short int n, short int li, short int ls, short int poz)
  {
   if(li==ls)
     return li;
   if(v[2*n]>=poz)
     return cauta(2*n,li,((int)li+ls)/2,poz);
   else
     return cauta(2*n+1,((int)li+ls)/2+1,ls,poz-v[2*n]);
  }

void erase(unsigned short int n, short int li, short int ls, short int poz)
  {
   if(li==ls)
     {
      v[n]=0;
      return;
     }
   if(poz<=(li+ls)/2)
     erase(2*n,li,((int)li+ls)/2,poz);
   else
     erase(2*n+1,((int)li+ls)/2+1,ls,poz);
   v[n]=v[2*n]+v[2*n+1];
  }

void solve(short int k)
  {
   short int x;
   if(!k)
     return;
   fscanf(fin,"%d",&x);
   solve(k-1);
   x=cauta(1,0,n-1,x);
   sol[x]=n-k+1;
   erase(1,0,n-1,x);
  }


int main()
{
fin=fopen(infile,"r");
fscanf(fin,"%d",&n);
build(1,0,n-1);
solve(n);
fclose(fin);

fout=fopen(outfile,"w");
for(int i=0;i<n;i++)
   fprintf(fout,"%d\n",sol[i]);
fclose(fout);
return 0;
}