Cod sursa(job #935463)

Utilizator rudarelLup Ionut rudarel Data 3 aprilie 2013 15:08:21
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>
#define input "order.in"
#define output "order.out"
int n,lung,pz,i;
FILE *fout;
struct nod{int cati,nr; nod *st,*dr;} *prim,*q;
void citire()
{
    FILE *fin;
    fin=fopen(input,"r");
    fscanf(fin,"%d",&n);
    fclose(fin);
}
void creaza(nod *prim, int ls, int ld)
{
    int k;
    prim->cati=ld-ls+1;
    if (prim->cati==1)      
         prim->nr=ls;
        else
            {
             k=(int)((ls+ld)/2);
             prim->nr=0;
             q=new nod;
             prim->st=q;
             q=new nod;
             prim->dr=q;
             creaza(prim->st,ls,k);
             creaza(prim->dr,k+1,ld);
            }
}
void cauta(nod *prim, int pozitie)
{
    if (prim->nr>0)
        {
         fprintf(fout,"%d ",prim->nr);
         prim->cati--;
         prim->nr=0;
        }
        else
            {
            prim->cati--;
            if (prim->st->cati>=pozitie) cauta(prim->st,pozitie);
               else cauta(prim->dr,pozitie-prim->st->cati);                       
            }
}
void rsd(nod *prim)
{
    if (prim->nr) fprintf(fout,"%d\n",prim->nr);
       else
        {
           rsd(prim->st);
           rsd(prim->dr);
        }
}
int main()
{
    citire();
    prim=new nod;  
    creaza(prim,1,n);  
    fout=fopen(output,"w");
    pz=2;
    lung=n;
    for (i=1;i<n;i++)
        {
         pz=(pz-1+i)%lung;      
         if (pz==0) pz=lung;
         lung--;
         cauta(prim,pz);
        }
    pz=pz;
    cauta(prim,1);
//  rsd(prim);
    fclose(fout);
    return 0;
}