Cod sursa(job #2755896)
Utilizator | Data | 28 mai 2021 18:23:42 | |
---|---|---|---|
Problema | Heapuri | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 3.75 kb |
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
char buff[4096];
int pbuf=4095;
void readbuff()
{
pbuf=0;
fin.read(buff,4095);
}
int citire()
{
int nr=0;
if(pbuf==4095)
{
readbuff();
}
while(buff[pbuf]<'0'||buff[pbuf]>'9')
{
pbuf++;
if(pbuf==4095)
{
readbuff();
}
}
while(buff[pbuf]>='0'&&buff[pbuf]<='9')
{
nr=nr*10+buff[pbuf]-'0';
pbuf++;
if(pbuf==4095)
{
readbuff();
}
}
return nr;
}
struct numar
{
int val,intrare;
}v[200005];
int p[200005];
int main()
{
int n,x,op,poz=0,poz1,poz2,cnt=0;
n=citire();
for(int i=1;i<=n;i++)
{
op=citire();
if(op==1)
{
cnt++;
poz++;
x=citire();
v[poz].val=x;
v[poz].intrare=cnt;
p[cnt]=poz;
poz1=poz;
while(poz1>=2)
{
if(v[poz1].val<v[poz1/2].val)
{
swap(p[v[poz1].intrare],p[v[poz1/2].intrare]);
swap(v[poz1],v[poz1/2]);
}
else
{
break;
}
poz1/=2;
}
}
else if(op==2)
{
x=citire();
poz2=p[x];
poz1=poz2;
swap(p[v[poz1].intrare],p[v[poz].intrare]);
swap(v[poz1],v[poz]);
v[poz].val=0;
v[poz].intrare=0;
poz--;
if(poz2!=poz+1)
{
poz1=poz2;
while(2*poz1<=poz)
{
if(2*poz1+1<=poz)
{
if(v[poz1].val>min(v[2*poz1+1].val,v[2*poz1].val))
{
if(v[2*poz1+1].val>v[2*poz1].val)
{
swap(p[v[poz1].intrare],p[v[2*poz1].intrare]);
swap(v[poz1],v[2*poz1]);
poz1=2*poz1;
}
else
{
swap(p[v[poz1].intrare],p[v[2*poz1+1].intrare]);
swap(v[poz1],v[2*poz1+1]);
poz1=2*poz1+1;
}
}
else
{
break;
}
}
else
{
if(v[poz1].val>v[2*poz1].val)
{
swap(p[v[poz1].intrare],p[v[2*poz1].intrare]);
swap(v[poz1],v[2*poz1]);
poz1=poz1*2;
}
else
{
break;
}
}
}
poz1=poz2;
while(poz1>=2)
{
if(v[poz1].val<v[poz1/2].val)
{
swap(p[v[poz1].intrare],p[v[poz1/2].intrare]);
swap(v[poz1],v[poz1/2]);
}
else
{
break;
}
poz1/=2;
}
}
}
else if(op==3)
{
fout<<v[1].val<<'\n';
}
}
return 0;
}