Pagini recente » Cod sursa (job #2427016) | Cod sursa (job #2381478) | Cod sursa (job #1807213) | Cod sursa (job #1505516) | Cod sursa (job #1450205)
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)
using namespace std;
ifstream f("heapuri.in");
ofstream g("heapuri.out");
int M,N,nrord;
int v[200005],ord[200005];
inline int firstson(int);
inline int secondson(int);
inline int dad(int);
inline void percolate(int);
inline void sift(int);
inline void inser(int);
int main()
{
N=0;
f>>M;
while (M--)
{
int tip;
f>>tip;
if (tip==1) {
int x;
f>>x;
inser(x);
}
else if (tip==2) {
int x,poz;
f>>x;
FOR (i,1,N)
if (ord[i]==x) {
poz=i;
break;
}
/*FOR (i,1,N)
cout<<ord[i]<<' ';
cout<<'\n';
FOR (i,1,N)
cout<<v[i]<<' ';
cout<<"\n\n";*/
x=poz;
swap(ord[x],ord[N]);
swap(v[x],v[N]);
N--;
if (v[x]<v[dad(x)] && x!=1)
percolate(x);
else
{
sift(x);
}
/*FOR (i,1,N)
cout<<ord[i]<<' ';
cout<<'\n';
FOR (i,1,N)
cout<<v[i]<<' ';
cout<<"\n\n\n";*/
}
else {
g<<v[1]<<'\n';
}
}
/*FOR (i,1,N)
cout<<ord[i]<<' ';
cout<<'\n';
FOR (i,1,N)
cout<<v[i]<<' ';
cout<<'\n';*/
f.close();g.close();
return 0;
}
inline int firstson(int n)
{
return 2*n;
}
inline int secondson(int n)
{
return 2*n+1;
}
inline int dad(int n)
{
return n/2;
}
inline void percolate(int n)
{
int val=v[n];
while (n>1 && val<v[dad(n)])
{
//cout<<n<<">1 "<<val<<'<'<<v[dad(n)]<<' '<<n<<'\n';
swap(ord[dad(n)],ord[n]);
v[n]=v[dad(n)];
n=dad(n);
//cout<<n<<">1 "<<val<<'<'<<v[dad(n)]<<' '<<n<<'\n';
}
v[n]=val;
//cout<<'\n';
}
inline void sift(int n)
{
int son;
do {
son=0;
if (firstson(n)<=N)
{
son=firstson(n);
if (secondson(n)<=N && v[secondson(n)]<v[firstson(n)])
son=secondson(n);
//cout<<son<<' ';
if (v[son]>=v[n])
son=0;
}
if (son) {
swap(ord[son],ord[n]);
swap(v[son],v[n]);
n=son;
}
//cout<<"\n\n";
}
while (son);
//cout<<'\n';
}
inline void inser(int elem)
{
v[++N]=elem;
ord[N]=++nrord;
percolate(N);
}