Pagini recente » Cod sursa (job #1525797) | Cod sursa (job #2778856) | Cod sursa (job #1119692) | Cod sursa (job #323903) | Cod sursa (job #2186895)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
typedef unsigned int uint;
uint heap[200007];
uint pos[200007];
uint idx = 1;
#define father(i) (i / 2)
#define left(i) (2 * i)
#define right(i) (2 * i + 1)
uint percolate(uint kpos);
void sift(uint kpos);
uint add(uint data);
void cut(uint kpos);
void heapify();
int main(void)
{
FILE *in = fopen("C:/Users/arco/Desktop/code/ads.txt", "r");
FILE *out = fopen("C:/Users/arco/Desktop/code/out.txt", "w");
if(in != NULL && out != NULL)
{
uint n, i = 0, dx = 1;
fscanf(in, "%u%*c", &n);
for(; i < n; i++)
{
uint t;
fscanf(in, "%u%*c", &t);
if(t == 1)
{
uint x;
fscanf(in, "%u%*c", &x);
uint k = add(x);
pos[dx++] = k;
}
else if(t == 2)
{
uint x;
fscanf(in, "%u%*c", &x);
cut(pos[x]);
}
else
{
fprintf(out, "%u\n", heap[1]);
}
for(uint j = 1; j < idx; j++)
{
printf("%u ", heap[j]);
}
printf("\n");
}
fclose(in);
fclose(out);
}
else
{
printf("file error\n");
}
return 0;
}
void heapify()
{
int i = idx / 2;
for(; i > 0; i--)
{
sift(i);
}
}
void cut(uint kpos)
{
heap[kpos] = heap[idx - 1];
idx--;
if(kpos > 1 && heap[kpos] < heap[father(kpos)])
{
percolate(kpos);
}
else
{
sift(kpos);
}
}
uint add(uint data)
{
heap[idx++] = data;
return percolate(idx - 1);
}
void sift(uint kpos)
{
int son;
do
{
son = 0;
if(left(kpos) < idx)
{
son = left(kpos);
if(right(kpos) < idx)
{
if(heap[left(kpos)] > heap[right(kpos)])
{
son = right(kpos);
}
}
if(heap[son] >= heap[kpos])
{
son = 0;
}
}
if(son)
{
uint temp = heap[son];
heap[son] = heap[kpos];
heap[kpos] = temp;
kpos = son;
}
}while(son);
}
uint percolate(uint kpos)
{
uint key = heap[kpos];
while(kpos > 1 && key < heap[father(kpos)])
{
heap[kpos] = heap[father(kpos)];
kpos = father(kpos);
}
heap[kpos] = key;
return kpos;
}