Cod sursa(job #1816519)
Utilizator | Data | 26 noiembrie 2016 16:18:07 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.25 kb |
#include <fstream>
using namespace std;
int v[200001],poz[200001],i,j,n,k,k2,c,p,x,nr,w[200001],N,nnr;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int main (){
fin>>n;
for (i=1;i<=n;i++){
fin>>nnr;
if (nnr == 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 (nnr == 2){
fin>>x;
nr = poz[x];
c = nr;
p = c/2;
v[nr] = v[k];
w[nr] = w[k];
poz[w[nr]] = poz[w[k]];
k--;
if (v[c] < v[p]){
//c = nr;
//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;
}
}
else{
p = nr;
c = 2*nr;
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 (nnr == 3)
fout<<v[1]<<"\n";
}
return 0;
}