Pagini recente » Cod sursa (job #900445) | Cod sursa (job #2910849) | Cod sursa (job #94951) | Istoria paginii runda/ichb_10_casi | Cod sursa (job #744792)
Cod sursa(job #744792)
#include<cstdio>
#include<vector>
using namespace std;
vector < pair < int , int > > H;
int k,n,x,y;
inline int father(int i)
{
return i>>1;
}
inline int left_son(int i)
{
return i<<1;
}
inline int right_son(int i)
{
return (i<<1)+1;
}
void percolate(int i)
{
int aux,auxs;
aux=H[i].first;
auxs=H[i].second;
while((i>1)&&(aux<H[father(i)].first))
{
H[i].first=H[father(i)].first;
H[i].second=H[father(i)].second;
i=father(i);
}
H[i].first=aux;
H[i].second=auxs;
}
void sift(int i)
{
int son,aux;
do
{
son=-1;
if(left_son(i)<H.size())
{
son=left_son(i);
if((right_son(i)<H.size())&&(H[right_son(i)].first < H[left_son(i)].first))
son=right_son(i);
if(H[son].first>=H[i].first)
son=-1;
}
if(son!=-1)
{
aux=H[i].first;
H[i].first=H[son].first;
H[son].first=aux;
aux=H[i].second;
H[i].second=H[son].second;
H[son].second=aux;
i=son;
}
}while(son!=-1);
}
void insert()
{
H.push_back(make_pair(y,++k));
percolate(k);
}
void cut(int i)
{
H[i].first=H[H.size()-1].first;
H[i].second=H[H.size()-1].second;
vector < pair < int , int > > ::iterator it = H.begin() + H.size()-1;
H.erase(it);
if((i>1)&&(H[i].first<H[father(i)].first))
percolate(i);
else
sift(i);
}
int search(int val)
{
/*int left,right,mid;
left=0;
right=H.size()-1;
while(left<=right)
{
mid=left+(right-left)/2;
if(H[mid].second==val)
return mid;
else
if(H[mid].second<val)
left=mid+1;
else
right=mid-1;
}
return -1;*/
int i;
for(i=1;i<H.size();i++)
if(H[i].second==val)
return i;
return -1;
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
H.push_back(make_pair(0,0));
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);
if(x!=3)
scanf("%d",&y);
if(x==1)
insert();
else
if(x==2)
cut(search(y));
else
printf("%d\n",H[1].first);
}
return 0;
}