Pagini recente » Cod sursa (job #918425) | Cod sursa (job #1643583) | Cod sursa (job #3193769) | Cod sursa (job #2114807) | Cod sursa (job #633534)
Cod sursa(job #633534)
//heap cu vector din stl 13.11.2011
//heap[1]=minimul
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int poz[200001],kpoz=0;
vector <int> v;
inline int tata(int nod) { return nod/2; }
inline int fiu_st(int nod) { return nod*2; }
inline int fiu_dr(int nod) { return nod*2+1; }
inline int min () { return v[1]; }
inline void schimba (int &a, int &b) { int cop=a; a=b; b=cop;}
void afisare() {cout<<endl; for (int i=1;i<v.size();i++) cout<<v[i]<<' ';};
void sift (int nod) //muta un nod in jos
{
int n=v.size()-1;
int fiu;
do
{
fiu=0; //cautam fiul mai mare/mic, apoi daca acesta e mai mare/mic decat tatal intersch
if (fiu_st(nod)<=n)
{
fiu=fiu_st(nod);
if (fiu_dr(nod)<=n && v[fiu_dr(nod)] < v[fiu_st(nod)])//*2
fiu=fiu_dr(nod);
if (v[fiu] >= v[nod]) //*
fiu=0;
}
if (fiu)
{
schimba(v[nod],v[fiu]);
nod=fiu; //pt a continua mutarea in jos
}
}while (fiu);
}
void percolate(int nod)
{
int crt=v[nod];
while ( (nod>1) && (crt < v[tata(nod)]) ) //*2
{
schimba (v[nod], v[tata(nod)]);
nod=tata(nod);
}
}
/*void create_heap()
{
for (int i=(v.size()-1)/2;i>0;--i)
sift(i);
}*/
void sterge(int nod)
{
v[nod]=v.back();
v.pop_back();
if (nod>1 && v[nod] < v[tata(nod)]) //*2
percolate(nod);
else
sift(nod);
}
void insert(int elem)
{
poz[++kpoz]=elem;
v.push_back(elem);
percolate(v.size()-1);
}
int cauta(int x) //returneaza indicele unde se afla elementul x in heap
{
for (int i=1;i<v.size();i++)
if (v[i]==x)
return i;
//if shit happens:
cout<<"\nelementul nu se afla in vector\n";
return 0;
}
int main ()
{
int n;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
fin>>n;
v.push_back(0);//ca sa inceapa de la 1
int x,y;
for (int i=1;i<=n;i++)
{
fin>>x;
if (x==1) { fin>>y; insert(y);}
else if (x==2) { fin>>y; sterge(cauta(poz[y])); }
else if (x==3) fout<<min()<<'\n';
}
fin.close(); fout.close();
return 0;
}