Pagini recente » Cod sursa (job #2628880) | Cod sursa (job #352951) | Cod sursa (job #1016429) | Cod sursa (job #72594) | Cod sursa (job #1288389)
#include <fstream>
using namespace std;
ifstream in ("heapuri.in");
ofstream out("heapuri.out");
const int N=200001;
int v[N], h[N], poz[N];
int n,nh,nr;
/*
arbore binar "compact"
h[1] = radacina
h[2*i] = fiul stang al lui i
h[2*i+1] = fiul drept al lui i
inaltimea = [logN]
heap: pentru orice i h[i] e mai bun ca h[2*i] si ca h[2*i+1] => cel mai bun e h[1]
urcare(i):
while (i >= 2 && h[i] e mai bun ca h[i/2]){
schimba(i, i/2);
i /= 2;
}
coborare(i):
int fs = 2*i, fd = 2*i + 1, bun = i;
if (fs <= nh && h[fs] e mai bun ca h[i])
bun = fs;
if (fd <= nh && h[fd] e mai bun ca h[i])
bun = fd;
if (bun != i) {
schimba(i, bun);
coboara(bun);
}
pentru arhiva educationala:
v[i] = al i-lea citit
h[i] = pozitia din v a celui care se afla in heap pe pozitia i => optimul va fi v[h[1]]
poz[i] = pozitia din heap a celui care a fost citit al i-lea
poz[h[i]] = i
h[poz[i]] = i
sterge(i):
schimba(i, nh--);
urca(i);
coboara(i);
*/
void schimba (int x, int y){
int a=h[x];
h[x]=h[y];
h[y]=a;
poz[h[x]]=x; //?
poz[h[y]]=y; //?
}
void urcare(int i){
while(i>=2 && v[h[i]]<v[h[i/2]]){
schimba(i,i/2);
i/=2;
}
}
void coborare(int i){
int fs = 2*i, fd = 2*i + 1, bun = i;
if (fs <= nh && v[h[fs]] < v[h[i]])
bun = fs;
if (fd <= nh && v[h[fd]] < v[h[i]])
bun = fd;
if (bun != i) {
schimba(i, bun);
coborare(bun);
}
}
int main(){
in>>n;
int i,a,x;
for(i=1;i<=n;i++){
in>>a;
if(a==1 || a==2){
in>>x;
}
if(a==1){
nh++;
v[++nr]=x;
h[nh]=nr;
poz[h[nh]]=nh;
urcare(nh);
}
if(a==2){
x=poz[x];
schimba(x,nh--);
urcare(x);
coborare(x);
}
if(a==3)
out<<v[h[1]]<<"\n";
//for(int j=1;j<=nh;j++)
// out<<v[j]<<" "<<h[j]<<" "<<poz[j]<<"\n";
}
return 0;
}