Pagini recente » Cod sursa (job #895678) | Cod sursa (job #1849268) | Cod sursa (job #2104667) | Cod sursa (job #2686151) | Cod sursa (job #1366733)
#include <cstdio>
#include <algorithm>
#define Nmax 200005
using namespace std;
class Heap{
private:
int Size;
int elem[Nmax]; /// elem[i] -> elementul de pe pozitia i
int poz[Nmax]; /// poz[i] -> pe ce pozitie se afla elementul bagat al i lea
int timp[Nmax]; /// timp[i] -> al catalea element a fost bagat cel de pe pozitia i
public:
Heap(){
Size = 0;
}
int tata(int k){
return k>>1;
}
int fiu_stg(int k){
return k<<1;
}
int fiu_drept(int k){
return (k<<1)|1;
}
void Upheap(int nodc){
int val = elem[nodc];
int pzvechi = timp[nodc];
int ordvechi = poz[timp[nodc]];
while(tata(nodc) != 0 && elem[tata(nodc)] > elem[nodc])
{
elem[nodc] = elem[tata(nodc)];
poz[nodc] = poz[timp[tata(nodc)]];
timp[nodc] = timp[tata(nodc)];
nodc = tata(nodc);
}
elem[nodc] = val;
timp[nodc] = pzvechi;
poz[timp[nodc]] = ordvechi;
}
void Downheap(int nodc){
int val = elem[nodc];
int pzvechi = timp[nodc];
while(1){
int cine = nodc;
if(fiu_stg(nodc) <= Size && elem[fiu_stg(nodc)] < elem[nodc])
cine = fiu_stg(nodc);
if(fiu_drept(nodc) <= Size && elem[fiu_drept(nodc)] < elem[cine])
cine = fiu_drept(nodc);
if(cine == nodc)
break;
elem[nodc] = elem[cine]; /// elem curent devine fiul
timp[nodc] = timp[cine];
poz[nodc] = poz[timp[nodc]];
nodc = cine;
}
elem[nodc] = val;
timp[nodc] = pzvechi;
poz[timp[nodc]] = nodc;
}
void Insert(int k,int crt){
Size++;
elem[Size] = k;
poz[Size] = crt;
timp[crt] = Size;
Upheap(Size);
}
void Delete(int crt){
int pz = poz[crt];
swap(elem[pz],elem[Size]);
swap(poz[crt],poz[timp[Size]]);
Size--;
Downheap(pz);
}
};
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
return 0;
}