Pagini recente » onis-2016/solutii-runda-1 | Cod sursa (job #966503) | Cod sursa (job #795320) | Cod sursa (job #1821888) | Cod sursa (job #1818368)
#include <fstream>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");
int v[200010],i,n,a,z[200010],b,k,cauta[200010],aux,j,h,nr;
void swap(int &a, int &b)
{
int c;
c=a;
a=b;
b=c;
}
void add(int i)
{
while(v[i]<v[i/2]&&i/2>0)
{
swap(v[i], v[i/2]);
swap(cauta[z[i]], cauta[z[i/2]]);
swap(z[i], z[i/2]);
i/=2;
}
}
void verificare(int i)
{
int c, p;
c=i*2;
p=i;
while(c<=k)
{
if(v[c+1]<v[c]&&c+1<=k)
c++;
if(v[p]>v[c])
{
swap(v[p], v[c]);
swap(cauta[z[p]], cauta[z[c]]);
swap(z[p], z[c]);
}
else
break;
p=c;
c*=2;
}
}
int main ()
{
fin>>n;
fin>>a>>b;
v[1]=b;
z[1]=1;
cauta[1]=1;
k=1;
nr=1;
for(i=2;i<=n;i++)
{
fin>>a;
if(a==1)
{
k++;
nr++;
fin>>v[k];
z[k]=nr;
cauta[nr]=k;
add(k);
}
if(a==2)
{
fin>>b;
j=cauta[b];
swap(v[j], v[k]);
swap(cauta[z[j]], cauta[z[k]]);
swap(z[j], z[k]);
k--;
verificare(j);
}
if(a==3)
fout<<v[1]<<"\n";
}
fin.close();
fout.close();
return 0;
}