Pagini recente » Cod sursa (job #40407) | Cod sursa (job #1447288) | Cod sursa (job #1340154) | Cod sursa (job #1954867) | Cod sursa (job #2286274)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct nod {int info, ord; } v[200005];
int vind[200005], j;
void insert(int x, int ord, int l)
{
int i = l;
v[i].info = x; v[i].ord = ord; vind[ord] = i;
while(i > 1 && v[i].info < v[i/2].info){
swap(v[i], v[i/2]);
swap(vind[v[i].ord], vind[v[i/2].ord]);
}
}
void erase(int a, int l)
{
int x = vind[a];
while(x*2 + 1 <= l - 1){
if(v[x*2].info < v[x*2 + 1].info){
v[x] = v[x*2]; vind[v[x].ord] = x;
x *= 2;
}
else{
v[x] = v[x*2 + 1]; vind[v[x].ord] = x;
x = x*2 + 1;
}
}
if(x*2 == l - 1) v[x] = v[x*2], vind[v[x].ord] = x;
if(x*2 > l - 1) insert(v[l - 1].info, v[l - 1].ord, x);
}
int main()
{
int n, t, x, k = 0, l;
fin >> n; l = 1;
for(j = 1; j <= n; j++){
fin >> t;
if(t == 1) fin >> x, insert(x, ++k, l), l++;
else if(t == 2) fin >> x, erase(x, l), l--;
else if(t == 3) fout << v[1].info <<"\n";
}
return 0;
}