Pagini recente » Cod sursa (job #2204306) | Cod sursa (job #2362370) | Cod sursa (job #3142307) | Cod sursa (job #723672) | Cod sursa (job #1816261)
#include <fstream>
using namespace std;
int v[200001],poz[200001],i,j,n,k,k2,c,p,x,nr,w[200001];
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int main (){
fin>>n;
for (i=1;i<=n;i++){
fin>>nr;
if (nr == 1){
// adaugam elemtul x in multime
fin>>w[i]; // elementele introduse, in ordine
v[++k] = w[i];
c = k;
p = c/2;
poz[++k2] = c;
while (v[c] < v[p]){
swap (v[c],v[p]);
//poz[c] = p;
//poz[p] = c;
poz[p] = c;
poz[k] = p;
// swap (poz[c],poz[p]);
c = p;
p /= 2;
}
// pozitia pe care se gaseste al i-lea element intrat in multime, din v
//v[k2].s = c;
}
if (nr == 2){
// stergem al x lea elemt intrat in multime
fin>>x;
v[poz[x]] = v[k];
//poz[x] = k;//****************
//poz[k] = poz[x];
k--;
// refacem heapul si pozitiile
p = poz[x];
c = 2*p;
while (c <= k){
if (c+1 <= k && v[c+1] < v[c])
c++;
if (v[p] > v[c]){
swap (v[p],v[c]);
poz[p] = c;
poz[x] = p;
//swap (poz[p],poz[c]);
p = c;
c = 2*c;
}
else
break;
}
}
if (nr == 3){
fout<<v[1]<<"\n";
}
}
return 0;
}