Pagini recente » Cod sursa (job #1006942) | Cod sursa (job #499831) | Cod sursa (job #587958) | Cod sursa (job #2085182) | Cod sursa (job #1577151)
#include <cstdio>
#define MAXN 200100
struct elem{int inf; int nr;};
elem H[MAXN];
int poz[MAXN];
int n, nrop;
void inserare(int inf, int timp) //O(n)=log2(n)
{
int fiu, tata;
fiu=++n;
tata=fiu/2;
while(tata>0&& H[tata].inf>inf)
{
H[fiu]=H[tata];
poz[H[tata].nr]=fiu;
fiu=tata;
tata=tata/2;
}
H[fiu].inf=inf;
H[fiu].nr=timp;
poz[timp]=fiu;
}
void combinare(int i)
{
int inf=H[i].inf, timp=H[i].nr, tata, fiu;
tata=i; fiu=2*i;
while(fiu<=n) //cat timp mai exista fii
{
if(fiu+1<=n&&H[fiu].inf>H[fiu+1].inf) fiu++;
//fiu indica cel mai mic dintre fii
if(H[fiu].inf<=inf) //daca cel mai mic este mai mic decat inf
{
//promovez pe cel mai mic dintre fii
H[tata]=H[fiu];
poz[H[fiu].nr]=tata;
tata=fiu;
fiu=2*tata;
}
else //am gasit locul
break;
}
H[tata].inf=inf;
H[tata].nr=timp;
poz[timp]=tata;
}
void rezolva_problema()
{
int i, x, y, t=0,j;
scanf("%d", &nrop);
for(i=1;i<=nrop;++i)
{
scanf("%d", &x);
if(x==1)
{
scanf("%d", &y);
// H[++n].inf=y;
++t;
// H[n].nr=t;
// poz[t]=n;
// combinare(j);
inserare(y, t);
}
else
if(x==2)
{
scanf("%d", &y);
H[poz[y]]=H[n--];
combinare(poz[y]);
}
else
printf("%d\n", H[1].inf);
}
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
rezolva_problema();
return 0;
}
/*#include <fstream>
#define DMAX 1000
using namespace std;
int H[DMAX];
int n;
ofstream fout("heap.out");
void inserare(int inf);
void creare_inserare();
void combinare(int i);
void creare_combinari();
int extrage_min();
void heapsort();
int main()
{
int i;
creare_combinari();
for(i=1;i<=n;++i) fout<<H[i]<<' ';
fout<<endl;
return 0;
}
void inserare(int inf) //O(n)=log2(n)
{
int fiu, tata;
fiu=++n;
tata=fiu/2;
while(tata>0&& H[tata]>inf)
{
H[fiu]=H[tata];
fiu=tata;
tata=tata/2;
}
H[fiu]=inf;
}
void creare_inserare()
{
int nr, i,x;
ifstream fin("heap.in");
fin>>nr;
for(i=1;i<=nr;++i)
{
fin>>x;
inserare(x);
}
}
void combinare(int i)
{
int inf=H[i], tata, fiu;
tata=i; fiu=2*i;
while(fiu<=n) //cat timp mai exista fii
{
if(fiu+1<=n&&H[fiu]>H[fiu+1]) fiu++;
//fiu indica cel mai mic dintre fii
if(H[fiu]<=inf) //daca cel mai mic este mai mic decat inf
{ //promovez pe cel mai mic dintre fii
H[tata]=H[fiu];
tata=fiu;
fiu=2*tata;
}
else //am gasit locul
break;
}
H[tata]=inf;
}
void creare_combinari()
{ int i;
ifstream fin("heap.in");
fin>>n;
for(i=1;i<=n;++i) fin>>H[i];
for(i=n/2;i>0;--i)
combinare(i);
}
int extrage_min()
{
int x=H[1];
H[1]=H[n--];
combinare(1);
return x;
}*/