Cod sursa(job #43171)

Utilizator the_andyAndrei Stefan the_andy Data 29 martie 2007 21:12:47
Problema Schi Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include<stdio.h>
#include<stdlib.h>
#define NMAX 30000;

struct elem
{
int id;
elem* prev;
elem* next;
};


int main(void)
{
FILE *f;
int n;
int i,x;
int cursor;
elem* prim;
elem* e1;
elem* e2;
elem* curent;
int directie;

f=fopen("schi.in","rt");
fscanf(f,"%d",&n);


//stim ca primul care vine va fi mereu primul
prim=(elem*) calloc(1,sizeof(elem));
prim->id=1;
prim->next=NULL;
prim->prev=NULL;
cursor=1;
curent=prim;
fscanf(f,"%d",&x);

for(i=2;i<=n;i++)
  {
  fscanf(f,"%d",&x);

  //muta cursorul pe pozitia x si insereaza valoarea i in fata cursorului
  if(cursor>x) directie=-1; else directie=+1;

  if(x==i) //insereaza la sfarsitul listei
    {
    while(cursor!=x-1)    //avanseaza pana la pozitia i-1 in lista
      {
      cursor+=1;
      curent=curent->next;
      }

    e1=(elem*) calloc(1,sizeof(elem));
    e1->id=x;
    e1->next=NULL;

    e1->prev=curent;
    curent->next=e1;
    }

    else //insereaza la o pozitie anume
    {

    while(cursor!=x)
    {
    cursor+=directie;
    if(directie==-1)
      curent=curent->prev;
      else
      curent=curent->next;
    }


    //insereaza un nou element
    e1=(elem*) calloc(1,sizeof(elem));
    e1->id=i;

    e1->next=NULL;
    e1->prev=NULL;

    if(curent->prev!=NULL)
      {
      (curent->prev)->next=e1;
      e1->prev=curent->prev;
      }

    e1->next=curent;
    curent->prev=e1;
    cursor+=1;
    }
  }
fclose(f);

//afiseaza
//aduce cursorul la 0
while(curent->prev!=NULL)
  curent=curent->prev;

e1=curent;

f=fopen("schi.out","wt");
while(e1!=NULL)
  {
  fprintf(f,"%d\n",e1->id);
  e1=e1->next;
  }
fclose(f);
return 0;
}