Pagini recente » Cod sursa (job #2379942) | Cod sursa (job #1894083) | Cod sursa (job #2519155) | Cod sursa (job #2174738) | Cod sursa (job #2952951)
#include <bits/stdc++.h>
#define nmax 200005
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout("heapuri.out");
int H[nmax],n;
int sz;
map<int,int>p;
vector<int> ord;
void combinare(int H[], int n, int i); //combin heapurile corecte cu radacinile 2i si 2i+1 cu nodul i
void creare_comb(int H[], int& n);
int extrag_min(int H[], int& n);
void stergere(int H[], int& n, int poz);
void inserare(int H[], int& n, int x);
void creare(int H[], int& n)
{
int x;
fin >> n;
for(int i=0 ; i<n ; )
{
fin >> x;
inserare(H,i,x);
}
}
void afisare(int H[], int n)
{
for(int i = 0 ; i < n ; ++i)
fout << H[i] << ' ';
}
int main()
{
int m;
fin >> m;
int t,x;
for(int i = 1 ; i <= m ; ++i)
{
fin >> t;
if(t==3)
{
fout<<H[1]<<'\n';
continue;
}
fin >> x;
if(t==1)
{
inserare(H,sz,x);
ord.push_back(x);
}
else
stergere(H,sz,p[ord[x-1]]);
}
return 0;
}
void inserare(int H[], int& n, int x)
{
int poz = n+1, tpoz=poz/2;
while(H[tpoz] > x && tpoz)
{
H[poz] = H[tpoz];
p[H[tpoz]] = poz;
poz = tpoz;
tpoz = poz/2;
}
H[poz]=x;
p[x] = poz;
n++;
}
void combinare(int H[], int n, int i)
{
int x = H[i], tata=i, fiu=2*i;
while(fiu <= n)
{
if(fiu+1 <= n && H[fiu+1] < H[fiu]) fiu++;
if(H[fiu]<x)
{
H[tata] = H[fiu];
p[H[fiu]] = tata;
tata = fiu;
fiu = 2*tata;
}
else break;
}
H[tata]=x;
p[x] = tata;
}
void stergere(int H[], int& n, int poz)
{
H[poz] = H[n--];
p[H[n]] = poz;
combinare(H,n,poz);
}
int extrag_min(int H[], int& n)
{
int ans = H[1];
H[1] = H[n--];
combinare(H,n,1);
return ans;
}
void creare_comb(int H[], int&n)
{
fin >> n;
for(int i = 1 ; i <= n ; ++i) fin >> H[i];
for(int i = n/2 ; i > 0 ; --i)combinare(H,n,i);
}