Pagini recente » Cod sursa (job #198250) | Cod sursa (job #1401748) | Cod sursa (job #865280) | Cod sursa (job #2210081) | Cod sursa (job #606652)
Cod sursa(job #606652)
#include<stdio.h>
#define MaxN 200100
#define father (i / 2)
#define lf (i * 2)
#define rf (i * 2) + 1
typedef struct
{
int info;
int pos;
} Heap;
Heap A[MaxN];
int B[MaxN];
int N;
int stare;
int a;
int nr;
int Nr;
void ReconstituieHeap(int i)
{
int max = i;
if(lf <= nr && A[lf].info<A[max].info)
max = lf;
if(rf <= nr && A[rf].info<A[max].info)
max = rf;
if(max != i)
{
Heap a = A[i];
A[i] = A[max];
A[max] = a;
B[A[i].pos] = i;
B[A[max].pos] = max;
ReconstituieHeap(max);
}
}
void ReconstituieHeapUp(int a)
{
int i;
Heap b = A[a];
for(i=a;i>1 && A[father].info>b.info;i=father)
{
A[i].info = A[father].info;
A[i].pos = A[father].pos;
B[A[i].pos] = i;
}
A[i] = b;
B[b.pos] = i;
}
void InsereazaHeap(int a)
{
int i;
for(i=++nr;i>1 && A[father].info>a;i=father)
{
A[i].info = A[father].info;
A[i].pos = A[father].pos;
B[A[i].pos] = i;
}
A[i].info = a;
A[i].pos = ++Nr;
B[Nr] = i;
}
void StergeHeap(int a)
{
A[a] = A[nr--];
B[A[a].pos] = a;
ReconstituieHeap(a);
ReconstituieHeapUp(a);
}
int main()
{
FILE *f = fopen("heapuri.in","r");
FILE *g = fopen("heapuri.out","w");
fscanf(f,"%d ",&N);
for(int i=1;i<=N;i++)
{
fscanf(f,"%d ",&stare);
switch(stare)
{
case 1 : {fscanf(f,"%d ",&a); InsereazaHeap(a);}
break;
case 2 : {fscanf(f,"%d ",&a); StergeHeap(B[a]);}
break;
case 3 : fprintf(g,"%d\n",A[1].info);
break;
}
}
fclose(g);
fclose(f);
return 0;
}