Pagini recente » Cod sursa (job #345450) | Cod sursa (job #2366008) | Cod sursa (job #1688311) | Cod sursa (job #2785026) | Cod sursa (job #349032)
Cod sursa(job #349032)
# 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[heap[a]].t>interval[heap[b]].t) return 1;
return 0;
}
void float_heap(long int i)
{
long int aux;
while (i/2&&better(i,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;
}