Pagini recente » Cod sursa (job #2695403) | Cod sursa (job #3159244) | Cod sursa (job #701831) | Cod sursa (job #2821230) | Cod sursa (job #844641)
Cod sursa(job #844641)
#include <stdio.h>
#define dim 200005
#define inf 99999999
#define swap(a,b)(a=a+b, b=a-b, a=a-b)
using namespace std;
int i,j,n,m,x,Min,poz,op,k;
int v[dim],man[dim],super[dim];
FILE *f=fopen("heapuri.in","r"), *g=fopen("heapuri.out","w");
void percolate(int i)
{int j, p;
v[i] = x;
j = i; man[i] = i; super[i] = i;
p = i/2;
while(p > 0)
{
if(x < v[p])
{swap(v[j],v[p]); swap(super[j], super[p]);
swap(man[i],man[p]);
j=p; p=p/2;
}
else break;
}
}
void sift(int i)
{int j,p;
v[i] = v[m];
//man[i] = man[m];
m--;
x = v[i];
j = i;
p = i*2;
Min = inf;
while(p <= m)
{
if( (v[p] < v[p+1]) || (p==m) ) {Min = v[p]; poz=p;}
else {Min = v[p+1]; poz=p+1;}
if(x > v[poz])
{swap(v[j],v[poz]); swap(super[j],super[poz]); swap(man[super[j]], man[super[poz]]);
j=poz; p=poz*2;
}
else break;
}
}
int main()
{
fscanf(f,"%d",&n);
for(i=1; i<=n; i++)
{fscanf(f,"%d",&op);
if(op < 3)
{k++;
fscanf(f,"%d",&x);
if(op == 1) {m++; percolate(k);}
else {sift(man[x]); man[x] = 0;}
}
else fprintf(g,"%d\n",v[1]);
}
return 0;
}