Pagini recente » Cod sursa (job #214001) | Cod sursa (job #2540534) | Cod sursa (job #79468) | Cod sursa (job #2876841) | Cod sursa (job #1013125)
#include <iostream>
#include <fstream>
#include <cstring>
#define DN 200005
using namespace std;
int arb[DN],v[DN],m;
void update(int poz)
{
for(; arb[poz/2] > arb[poz] && poz!=1 ; poz/=2)
swap(arb[poz/2],arb[poz]);
}
int caut(int nod,int &x)
{
if(arb[nod]==x)
return nod;
if(arb[2*nod] >= x)
return caut(2*nod,x);
if(arb[2*nod+1] >= x)
return caut(2*nod+1,x);
}
void sift(int nod)
{
int x=min(arb[2*nod],arb[2*nod+1]);
if(arb[nod] > x)
{
if(x==arb[2*nod]){
swap(arb[nod],arb[2*nod]);
sift(2*nod);
}
else{
swap(arb[nod],arb[2*nod+1]);
sift(2*nod+1);
}
}
}
int main()
{
ifstream f("heapuri.in");
ofstream g("heapuri.out");
f>>m;
memset(arb,127,sizeof(arb));
arb[0]=0;
for(;m;--m)
{
int op,x;
f>>op;
if(op==1)
{
f>>x;
arb[++arb[0]] = x;
v[++v[0]]=x;
update(arb[0]);
}
if(op==2)
{
f>>x;
x=v[x];
int nod=caut(1,x);
swap(arb[nod],arb[ arb[0] ]);
arb[ arb[0] ]=1<<30;
--arb[0];
sift(nod);
}
if(op==3)
g<<arb[1]<<"\n";
}
return 0;
}