Cod sursa(job #2091038)

Utilizator AnduRazvanMindrescu Andu AnduRazvan Data 19 decembrie 2017 03:42:52
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
#define nmax 2147483647 //2^31-1
using namespace std;
int n,m,a[500001],s[1000001],op,x,y,poz;
void Creare(int nod,int st,int dr)
{ int mij=st+(dr-st)/2;
    if(st==dr) s[nod]=a[st];
    else
    { Creare(nod*2,st,mij);
      Creare(nod*2+1,mij+1,dr);
      s[nod]=min(s[nod*2],s[nod*2+1]);
    }
}
int Find(int nod,int st,int dr,int x)
{ if(st==dr&&a[st]==x) return nod;
    else { int mij=st+(dr-st)/2;
           if(s[nod*2]==x) return Find(nod*2,st,mij,x);
           else return Find(nod*2+1,mij+1,dr,x);
         }
}
void Actualizare(int poz)
{ s[poz/2]=min(s[poz/2*2],s[poz/2*2+1]);
    if(poz!=1) Actualizare(poz/2);
}
int main()
{ FILE *f,*g;
  f=fopen("algsort.in","r");
  g=fopen("algsort.out","w");
  fscanf(f,"%d",&n);
  int i;
  //for(i=1;i<=2*n;i++) s[i]=nmax;
   for(i=1;i<=n;i++) fscanf(f,"%d",&a[i]);
   Creare(1,1,n);
   for(i=1;i<=n;i++)
    { fprintf(g,"%d ",s[1]);
      poz=Find(1,1,n,s[1]);
      s[poz]=nmax;
      Actualizare(poz);
    }
    return 0;
}