Cod sursa(job #751160)
Utilizator | Data | 24 mai 2012 18:37:40 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 2.78 kb |
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
using namespace std;
struct ce{
int n,d;
};
void du(int k);
void de(int k);
vector<int> p(1);
vector<ce> h;
main(){
int n,m,a,b,di;
const int inf=1<<30;
ifstream cinr ("heapuri.in");
ofstream cour ("heapuri.out");
cinr >> n;
ce c;
c.n=0; c.d=-inf;
h.push_back(c);
for(int j=1; j<=n; j++){
cinr >> m;
if(m==1){
cinr >> c.d;
c.n=p.size();
h.push_back(c);
p.push_back(h.size()-1);
du(h.size()-1);
}
if(m==2){
cinr >> a;
p[h[h.size()-1].n]=p[a];
h[p[a]]=h[h.size()-1];
h.pop_back();
de(p[a]);
}
if(m==3) cour << h[1].d << "\n";
}
//cin.ignore(1);
cinr.close();
cour.close();
return 0;
}
void du(int k){
ce c;
int i=k,y,u;
while(h[i/2].d>h[i].d){
y=i/2;
u=p[h[i].n];
p[h[i].n]=p[h[y].n];
p[h[y].n]=u;
c=h[i];
h[i]=h[y];
h[y]=c;
i=y;
}
}
void de(int k){
ce c;
int i=k,y,u;
while(2*i+1<h.size()){
y=2*i;
if(h[y].d>h[y+1].d) y++;
if(h[i].d>h[y].d){
u=p[h[i].n];
p[h[i].n]=p[h[y].n];
p[h[y].n]=u;
c=h[i];
h[i]=h[y];
h[y]=c;
}
else { return; }
i=y;
}
y=2*i;
if(y<h.size()){
if(h[i].d>h[y].d){
u=p[h[i].n];
p[h[i].n]=p[h[y].n];
p[h[y].n]=u;
c=h[i];
h[i]=h[y];
h[y]=c;
}
}
}