Pagini recente » Cod sursa (job #982766) | Cod sursa (job #15874) | Cod sursa (job #2543840) | Cod sursa (job #2492671) | Cod sursa (job #643516)
Cod sursa(job #643516)
#include<stdio.h>
#define nr_elemente 200001
using namespace std;
FILE *c,*d;
int heap[nr_elemente],r[nr_elemente],v[nr_elemente],n_r,n_h;
void swap(int &a,int &b)
{
int aux;
aux=a;
a=b;
b=aux;
}
void min_heapify_down(int i)
{
int left,right,poz;
poz=i;
left=2*i;
right=2*i+1;
if(left<=n_h&&r[heap[left]]<r[heap[poz]])
poz=left;
if(right<=n_h&&r[heap[right]]<r[heap[poz]])
poz=right;
if(poz!=i)
{
swap(heap[i],heap[poz]);
swap(v[heap[i]],v[heap[poz]]);
min_heapify_down(poz);
}
}
void min_heapify_up(int i)
{
int p,poz;
poz=i;
p=i/2;
if(p>=1&&r[heap[p]]>r[heap[poz]])
poz=p;
if(poz!=i)
{
swap(heap[i],heap[poz]);
swap(v[heap[i]],v[heap[poz]]);
min_heapify_up(poz);
}
}
void insert_node(int x)
{
n_r++;
r[n_r]=x;
n_h++;
heap[n_h]=n_r;
v[n_r]=n_h;
min_heapify_up(n_h);
}
void delete_node(int i)
{
heap[i]=heap[n_h];
n_h--;
if(i/2>=1&&r[heap[i/2]]>r[heap[i]])
min_heapify_up(i);
else
if((2*i<=n_h&&r[heap[2*i]]<r[heap[i]])||(2*i+1<=n_h&&r[heap[2*i+1]]<r[heap[i]]))
min_heapify_down(i);
}
int elementul_minim()
{
return r[heap[1]];
}
int main()
{
int n,i,a,b;
n_h=0;
n_r=0;
c=fopen("heapuri.in","r");
d=fopen("heapuri.out","w");
fscanf(c,"%d",&n);
for(i=1;i<=n;i++)
{
fscanf(c,"%d",&a);
if(a==1)
{
fscanf(c,"%d",&b);
insert_node(b);
}
else
if(a==2)
{
fscanf(c,"%d",&b);
delete_node(v[b]);
v[b]=0;
}
else
fprintf(d,"%d\n",elementul_minim());
}
fclose(c);
fclose(d);
}