Pagini recente » Cod sursa (job #2042117) | Cod sursa (job #1955866) | Cod sursa (job #136789) | Cod sursa (job #506572) | Cod sursa (job #244520)
Cod sursa(job #244520)
using namespace std;
#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>
#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair
typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;
#define IN "heapuri.in"
#define OUT "heapuri.out"
#define left(x) ((x)<<1)
#define right(x) (left(x)+1)
#define N_MAX 1<<18
int K,N;
int A[N_MAX],P[N_MAX],H[N_MAX];
II void scan()
{
freopen(IN,"r",stdin);
freopen(OUT,"w",stdout);
scanf("%d",&K);
}
II void down_heap(int nod)
{
for(;(A[nod] > A[nod<<1] || A[nod] > A[(nod<<1)+1]) && (nod<<1) <= N;)
if(A[nod<<1] < A[(nod<<1)+1])
{
swap(P[ H[nod] ],P[ H[nod<<1] ]);
swap(H[nod],H[(nod<<1)+1]);
swap(A[nod],A[nod<<1]);
nod <<= 1;
}
else
{
swap(P[ H[nod] ],P[ H[(nod<<1)+1] ]);
swap(H[nod],H[(nod<<1)+1]);
swap(A[nod],A[(nod<<1)+1]);
nod <<= 1;
++nod;
}
}
II void up_heap(int nod)
{
for(;nod>1 && A[nod] < A[nod>>1];nod >>= 1)
{
swap(P[ H[nod] ],P[ H[nod>>1] ]);
swap(H[nod],H[nod>>1]);
swap(A[nod],A[nod>>1]);
}
}
II void pop_heap(int nod)
{
A[nod] = A[N];
--N;
if(nod>1 && A[nod>>1] > A[nod])
up_heap(nod);
else
down_heap(nod);
}
II void insert_heap(int val)
{
A[++N] = val;
P[++P[0]] = N;
H[N] = P[0];
up_heap(N);
}
II void solve()
{
int t,x;
FOR(i,1,K)
{
scanf("%d",&t);
if(t!=3)
scanf("%d",&x);
if(t==1)
insert_heap(x);
if(t==2)
pop_heap(P[x]);
if(t==3)
printf("%d\n",A[1]);
}
}
int main()
{
scan();
solve();
return 0;
}