Pagini recente » Cod sursa (job #2908825) | Cod sursa (job #3239291) | Cod sursa (job #2691726) | Cod sursa (job #1367574) | Cod sursa (job #2617677)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
struct nod
{
int x,y;
};
vector<nod> heap;
int parinte(int x)
{
return (x-1)/2;
}
int fiu_st(int x)
{
return 2*(x+1)-1;
}
int fiu_dr(int x)
{
return 2*(x+1);
}
void insrt(nod n)
{
heap.push_back(n);
int i=heap.size();
heap[i-1].x=i;
i--;
while(i>0&&heap[parinte(i)].y>heap[i].y)
{
nod aux=heap[i];
heap[i]=heap[parinte(i)];
heap[parinte(i)]=aux;
i=parinte(i);
}
}
void del(int j)
{
unsigned i=0;
while(j!=heap[i].x&&i<heap.size())
i++;
while(i<heap.size())
{
if(fiu_dr(i)<heap.size()&&fiu_st(i)>=heap.size())
{
heap[i]=heap[fiu_dr(i)];
if(fiu_dr(fiu_st(i))>=heap.size()&&fiu_dr(fiu_dr(i))>=heap.size())
{
heap.erase(heap.begin()+fiu_dr(i));
break;
}
i=fiu_dr(i);
}
else if(fiu_st(i)<heap.size()&&fiu_dr(i)>=heap.size())
{
heap[i]=heap[fiu_st(i)];
if(fiu_st(fiu_st(i))>=heap.size()&&fiu_st(fiu_dr(i))>=heap.size())
{
heap.erase(heap.begin()+fiu_st(i));
break;
}
i=fiu_st(i);
}
else if(heap[fiu_dr(i)].y<heap[fiu_st(i)].y)
{
heap[i]=heap[fiu_dr(i)];
if(fiu_st(fiu_st(i))>=heap.size()&&fiu_st(fiu_dr(i))>=heap.size())
{
heap.erase(heap.begin()+fiu_dr(i));
break;
}
i=fiu_dr(i);
}
else
{
heap[i]=heap[fiu_st(i)];
if(fiu_dr(fiu_st(i))>=heap.size()&&fiu_dr(fiu_dr(i))>=heap.size())
{
heap.erase(heap.begin()+fiu_st(i));
break;
}
i=fiu_st(i);
}
}
}
int main()
{
int n;
fin>>n;
int i=0;
while(n--)
{
int op;
fin>>op;
if(op==1)
{
nod x;
fin>>x.y;
insrt(x);
}
else if(op==2)
{
int x;
fin>>x;
del(x);
}
else{
fout<<heap[0].y<<"\n";
}
}
return 0;
}