Pagini recente » Cod sursa (job #154567) | Cod sursa (job #1453521) | Cod sursa (job #103525) | Cod sursa (job #2970044) | Cod sursa (job #713418)
Cod sursa(job #713418)
#include <fstream>
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int heap[200001], ord[200001], m, n, k;
inline int tata (int n)
{
return n/2;
}
inline int fiu_st (int n)
{
return n*2;
}
inline int fiu_dr (int n)
{
return n*2+1;
}
void urcare(int poz);
void coborare(int poz);
void adaugare(int val)
{
heap[++n]=ord[++k]=val;
urcare(n);
}
/*int cautare(int val, int i)
{
if(heap[i]==val) return i;
if(heap[i]>val) return 0;
if(fiu_st(i)<n && fiu_dr(i)<=n)
{
int x, y;
x=cautare(val, fiu_st(i));
y=cautare(val, fiu_dr(i));
return (x>y ? x : y);
}
if(fiu_st(i)<=n) return cautare(val, fiu_st(i));
return 0;
}*/
int cautare(int val, int i)
{
for(i=1; i<=n; i++)
if(heap[i]==val) return i;
}
void stergere (int poz)
{
heap[poz]=heap[n--];
if(heap[tata(poz)] > heap[poz])
urcare(poz);
else coborare(poz);
}
void urcare(int poz)
{
int temp=heap[poz], i=poz;
while(heap[tata(i)] > temp && tata(i))
heap[i]=heap[tata(i)], i=tata(i);
heap[i]=temp;
}
void coborare(int poz)
{
bool ok=true;
while(fiu_st(poz)<n && ok)
{
ok=false;
int Min=(heap[fiu_st(poz)]<heap[fiu_dr(poz)] ? fiu_st(poz) : fiu_dr(poz));
if(heap[Min]<heap[poz])
{
int temp=heap[poz], i=(fiu_st(poz)==Min ? fiu_st(poz) : fiu_dr(poz));
heap[poz]=heap[i];
heap[i]=temp;
coborare(i);
ok=true;
}
}
if(fiu_st(poz)==n && heap[fiu_st(poz)]<heap[poz])
{
int temp=heap[poz];
heap[poz]=heap[fiu_st(poz)];
heap[fiu_st(poz)]=temp;
}
}
void meniu()
{
int x;
in>>m;
while(m)
{
m--;
in>>x;
switch(x)
{
case 1: in>>x;
adaugare(x);
break;
case 2: in>>x;
stergere(cautare(ord[x],1));
break;
case 3: out<<heap[1]<<"\n";
}
}
}
int main()
{
meniu();
return 0;
}