Cod sursa(job #349011)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 17 septembrie 2009 19:16:58
Problema Curcubeu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
# include <stdio.h>
# include <stdlib.h>

typedef struct INTERVAL
        {
        long int a,b,c,t;
        };
        
const long int MAXN=1000000;

INTERVAL interval[MAXN+1];
long int n,heap[MAXN+1],heaplen;
        
int compara_INTERVAL(const void *aa, const void *bb)
{
    INTERVAL *a=(INTERVAL*)aa,*b=(INTERVAL*)bb;
    if (a->a>b->a) return 1;
    return 0;
}

int better(long int a, long int b)
{
    if (interval[a].t>interval[b].t) return 1;
    return 0;
}

void float_heap(long int i)
{
     long int aux;
     while (i/2&&better(heap[i],heap[i/2]))
           {
           aux=heap[i];heap[i]=heap[i/2];heap[i/2]=aux;
           i/=2;
           }
}

void submerge_heap(long int i)
{
     long int aux,min;
     do
       {
       min=i;
       if (2*i<=heaplen&&better(2*i,min)) min=2*i;
       if (2*i+1<=heaplen&&better(2*i+1,min)) min=2*i+1;
       if (min==i) return;
       aux=heap[min];heap[min]=heap[i];heap[i]=aux;
       i=min;
       }
     while (1);
}

void insert_heap(long int i)
{
     heap[++heaplen]=i;
     float_heap(heaplen);
}

void extract_heap()
{
     heap[1]=heap[heaplen];
     heap[heaplen]=0;
     heaplen--;
     submerge_heap(1);
}

void citire()
{
     long int a,c,b;
     FILE *f=fopen("curcubeu.in","r");
     fscanf(f,"%ld%ld%ld%ld",&n,&a,&b,&c);
     long int i=1;
     do
       {
       if (a<b) 
          {
          interval[i].a=a;
          interval[i].b=b;
          }
       else
           {
           interval[i].b=a;
           interval[i].a=b;
           }
       interval[i].c=c;
       interval[i].t=i;
       i++;
       a=(a*i)%n;
       b=(b*i)%n;
       c=(c*i)%n;
       }
     while (i<=n-1);
     qsort(interval+1,n-1,sizeof(INTERVAL),compara_INTERVAL);
}      

void scrie()
{
     FILE *g=fopen("curcubeu.out","w");
     long int i,prim=1;
     for (i=1;i<=n-1;i++)
         {
         //incarca in heap toate intervalele care incep la i
         while (interval[prim].a==i&&prim<=n-1) 
               {
               insert_heap(prim);
               prim++;
               }
         //scoate din heap toate intervalele care s-au terminat deja
         while (interval[heap[1]].b<i&&heaplen) extract_heap();
         //scrie
         if (heaplen==0) fprintf(g,"0\n");
         else fprintf(g,"%ld\n",interval[heap[1]].c);
         }
     fclose(g);
}

int main()
{
    citire();
    //scrie();
    return 0;
}