Pagini recente » Cod sursa (job #2004423) | Cod sursa (job #177188) | Cod sursa (job #2159980) | Cod sursa (job #3037991) | Cod sursa (job #867772)
Cod sursa(job #867772)
#include<iostream>
#include<iostream>
#include<fstream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<bitset>
#include<algorithm>
#define INF (1 << 30)
#define pb push_back
#define mkp make_pair
#define pii pair<int, int>
#define ll long long
#define nxt (*it)
#define type int
#define FORi(i,a,b)\
for(int i=a; i<=b; ++i)
#define FORr(g)\
for(vector<type>::reverse_iterator it=g.rbegin(); it!=g.rend(); ++it)
#define FOR(g)\
for(vector<type>::iterator it=g.begin(); it!=g.end(); ++it)
#define infile "heapuri.in"
#define outfile "heapuri.out"
#define nMax 200005
using namespace std;
int H[nMax], NH;
int pos[nMax], val[nMax];
int N;
void push(int el){
pos[el] = ++ NH;
H[NH] = el;
int x = NH;
while(x > 1 && val[H[x]] < val[H[x/2]]){
swap(pos[H[x]], pos[H[x/2]]);
swap(H[x], H[x/2]);
x = x/2;
}
}
void erase(int x){
H[x] = H[NH--];
pos[H[x]] = x;
int rs, ls, son;
while(true){
ls = 2 * x;
rs = 2 * x + 1;
son = x;
if(ls <= NH && val[H[ls]] < val[H[son]])
son = ls;
if(rs <= NH && val[H[rs]] < val[H[son]])
son = rs;
if(son == x)
return;
swap(pos[H[son]], pos[H[x]]);
swap(H[son], H[x]);
x = son;
}
}
int main(){
ifstream f(infile);
ofstream g(outfile);
f >> N;
int j, op;
FORi(i,1,N){
f >> op;
switch(op){
case 1:{
f >> val[i];
push(i);
}break;
case 2:{
f >> j;
erase(pos[j]);
}break;
case 3:{
g << val[H[1]] << '\n';
}
}
}
f.close();
g.close();
return 0;
}