Pagini recente » Cod sursa (job #1859420) | Cod sursa (job #3173393) | Cod sursa (job #1306407) | Cod sursa (job #1710699) | Cod sursa (job #613505)
Cod sursa(job #613505)
#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 2147483647
FILE *fin=fopen("sortaret.in","r");
FILE *fout=fopen("sortaret.out","w");
int n,m,i,a,b,H[50005],j,poz[50001],x;
// functii pentru noduri si copii.
inline int father(int nod) { // pozitia tatalui copilului de pe pozitia "nod"
return nod / 2;
}
inline int left_son(int nod) { // pozitia copilului tatalui de pe pozitia "nod"
return nod * 2;
}
inline int right_son(int nod) { // pozitia copilului tatalui de pe pozitia "nod"
return nod * 2 + 1;
}
void sift(int H[], int n, int k) {
int son,aux;
son=1;
while(son){ // cat timp copilul este mai mare decat tatal
son = 0;
if (left_son(k)<=n) { // verific daca pozitia fiului din stanga este in heap (elementul apartine heap-ului)
son=left_son(k);
if ( right_son(k)<=n && H[right_son(k)]>H[left_son(k)] ) { // daca fiul din dreapta este in heap
son=right_son(k); // iar valoarea lui este mai mare decat a celuilalt copil ...
}
if(H[son]<=H[k]){
son=0; // valoarea tatalui este mai mare decat a copiilor
}
}
if(son!=0){ // daca exista un copil cu valoarea mai mare decat a tatalui
aux=H[k]; // interschimba
H[k]=H[son];
H[son]=aux;
k = son; // pozitia tatalui devine pozitia fiului anterior (se alege alt tata)
}
}
}
void build_heap(int H[], int n){
int i;
for(i=n/2; i>0; i--) {
sift(H, n, i);
}
}
void heap_sort(int H[], int n){
int aux,i;
build_heap(H,n);
for (i = n; i >= 2; --i) {
aux=H[1];
H[1]=H[i];
H[i]=aux;
sift(H, i - 1, 1);
}
}
int main(){
fscanf(fin,"%d %d",&n,&m);
for(i=1;i<=50001;i++){
H[i]=-INF;
}
fscanf(fin,"%d %d",&a,&b);
H[1]=a;
H[2]=b;
poz[a]=1;
poz[b]=2;
for(i=2;i<=m;i++){
fscanf(fin,"%d %d",&a,&b);
x=poz[a]*2;
if(H[x]==-INF){
H[x]=b;
poz[b]=x;
}
else{
H[x+1]=b;
poz[b]=x+1;
}
}
heap_sort(H, n);
for(i=1;i<=50001;i++){
if(H[i]!=-INF) fprintf(fout,"%d ",H[i]);
}
return 0;
}