Pagini recente » Istoria paginii monthly-2012/runda-4/solutii | Cod sursa (job #1122775) | Cod sursa (job #74628) | Cod sursa (job #451674) | Cod sursa (job #2263258)
#include<bits/stdc++.h>
//#define x first
//#define y second
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int h[200002],p[200002],pp[200002],n;
void urca(int x)
{
while(x>1&&h[x]<h[x/2])
{
swap(h[x],h[x/2]);
swap(p[pp[x]],p[pp[x/2]]);
swap(pp[x],pp[x/2]);
x/=2;
}
}
void coboara(int x)
{
int nr=x;
if(2*x<=n&&h[nr]>h[2*x])
nr=2*x;
if(2*x+1<=n&&h[nr]>h[2*x+1])
nr=2*x+1;
if(nr!=x)
{
swap(h[x],h[nr]);
swap(p[pp[x]],p[pp[nr]]);
swap(pp[x],pp[nr]);
return coboara(nr);
}
}
int main()
{
int q,nn=0,i,c,nr;
in>>q;
while(q--)
{
in>>c;
if(c==1)
{
in>>nr;
h[++n]=nr;
p[++nn]=n;
pp[n]=n;
urca(n);
}
else if(c==2)
{
in>>nr;
swap(h[p[nr]],h[n]);
pp[p[nr]]=pp[n--];
coboara(p[nr]);
urca(p[nr]);
}
else
out<<h[1]<<"\n";
}
return 0;
}