Pagini recente » Cod sursa (job #2550588) | Cod sursa (job #1290067) | Cod sursa (job #2390280) | Cod sursa (job #1835729) | Cod sursa (job #266751)
Cod sursa(job #266751)
#include<stdio.h>
#define max 200010
long h[max], n, m, x, y, o;
struct
{ long val, poz;
} a[max];
FILE *f, *g;
void poz(long x, long p)
{ long i;
for(i=1; i<=o; i++)
if(a[i].val==x)
{ a[i].poz=p;
break;
}
}
void ins(long v)
{ long k, z;
h[++n]=v;
k=n;
while(h[k/2]>h[k] && k>1)
{ z=h[k]; h[k]=h[k/2]; h[k/2]=z;
poz(h[k], k);
poz(h[k/2], k/2);
k=k/2;
}
}
void del(long k)
{ long z, m;
k=a[k].poz;
z=h[k]; h[k]=h[n]; h[n]=z;
poz(h[k], k); poz(h[n], 0);
n--;
while(( (h[2*k]<h[k] && 2*k<=n) ||
(h[2*k+1]<h[k] && 2*k+1<=n) ) && k<n)
{ if(2*k==n) m=2*k;
else if(h[2*k]<h[2*k+1]) m=2*k;
else m=2*k+1;
z=h[m]; h[m]=h[k]; h[k]=z;
poz(h[m], m);
poz(h[k], k);
k=m;
}
}
int main()
{ long i;
f=fopen("heapuri.in", "r");
g=fopen("heapuri.out", "w");
fscanf(f, "%ld", &m);
for(i=1; i<=m; i++)
{ fscanf(f, "%ld", &x);
if(x==3)
fprintf(g, "%ld\n", h[1]);
else
{ fscanf(f, "%ld", &y);
if(x==1)
{ o++;
a[o].val=y;
a[o].poz=n+1;
ins(y);
}
else
del(y);
}
}
return 0;
}