Pagini recente » Cod sursa (job #108854) | Cod sursa (job #190998) | Cod sursa (job #761147) | Cod sursa (job #87710) | Cod sursa (job #1816454)
#include <fstream>
using namespace std;
int v[200001],poz[200001],i,j,n,k,k2,c,p,x,nr,w[200001],N;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int main (){
fin>>n;
for (i=1;i<=n;i++){
fin>>nr;
if (nr == 1){
fin>>x;
k++;
N++;
v[k] = x; // heap
w[k] = N; // pozitiile in care au fost inserate numerele
poz[N] = k; // pozitia din heap a unui element
c = k;
p = c/2;
while (p>=0){
if (v[c] < v[p]){
swap (v[c],v[p]);
swap (w[c],w[p]);
poz[w[p]] = p;
poz[w[c]] = c;
c = p;
p = p/2;
}
else
break;
}
}
if (nr == 2){
fin>>x;
nr = poz[x];
p = nr;
c = 2*nr;
v[nr] = v[k];
w[nr] = w[k];
poz[w[nr]] = poz[w[k]];
k--;
while (c<=k){
if (c+1 <= k && v[c+1] < v[c])
c++;
if (v[c] < v[p]){
swap (v[c],v[p]);
swap (w[c],w[p]);
poz[w[p]] = p;
poz[w[c]] = c;
p = c;
c = 2*p;
}
else
break;
}
}
if (nr == 3)
fout<<v[1]<<"\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];
poz[x] = 0;
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;
}