Pagini recente » Cod sursa (job #3241179) | Cod sursa (job #3161617) | Cod sursa (job #2211033) | Cod sursa (job #2611047) | Cod sursa (job #845052)
Cod sursa(job #845052)
#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 j, p;
v[m] = x;
j = m; super[m] = k; man[super[m]] = m;
p = m/2;
while(p > 0)
{
if(x < v[p])
{swap(v[j],v[p]); swap(super[j], super[p]);
//swap(man[super[j]],man[super[p]]);
man[super[j]] = j; man[super[p]] = p;
j=p; p=p/2;
}
else break;
}
}
void Heap(int i)
{int j,p;
v[i] = v[m];
super[i] = super[m];
man[super[i]] = m;
man[super[m]] = 0;
//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]);
man[super[j]] = j; man[super[poz]] = poz;
j=poz; p=poz*2;
}
else break;
}
j = i;
p = i/2;
while(p > 0)
{
if(x < v[p])
{swap(v[j],v[p]); swap(super[j], super[p]);
//swap(man[super[j]],man[super[p]]);
man[super[j]] = j; man[super[p]] = p;
j=p; p=p/2;
}
else break;
}
}
int main()
{
fscanf(f,"%d",&n);
for(i=1; i<=n; i++)
{fscanf(f,"%d",&op);
if(op < 3)
{
fscanf(f,"%d",&x);
if(op == 1) {m++; k++; percolate();}
else Heap(man[x]);
}
else fprintf(g,"%d\n",v[1]);
}
return 0;
}