Cod sursa(job #1308948)

Utilizator danielmaxim95FMI Maxim Daniel danielmaxim95 Data 4 ianuarie 2015 21:58:09
Problema Statistici de ordine Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#include <cstdlib>
#include <algorithm>

using namespace std;

int v[3000003],n,k,gasit;

void dvd(int st,int dr,int &m)
{
    int i, pm=st, is=st, id;

    for(i=st; i<=dr; i++)
        if(v[i]<v[m])
            pm++;
    id=pm;

    v[m]=v[m]^v[pm]^(v[pm]=v[m]);

    while((is<pm)&&(id<dr))
    {
        while(v[pm]>=v[is])is++;
        while(v[pm]<=v[id])id++;
        v[id]=v[id]^v[is]^(v[is]=v[id]);
        id++;
        is++;
    }
    m=pm;
}

void quick(int st,int dr)
{
    int m=rand()%(dr-st+1)+st;
    if((st<=dr)&&(!gasit))
    {
        dvd(st,dr,m);
        if(m>k)
            quick(st,m-1);
        else
            if(m<k)
                quick(m+1,dr);
            else
                gasit=v[m];
    }
}

int main()
{
    FILE *f,*g;
    int i,x;
    f=fopen("sdo.in","r");
    fscanf(f,"%d %d",&n,&k);
    for(i=1; i<=n; i++)
        fscanf(f,"%d", &v[i]);
    fclose(f);

    gasit=0;
    quick(1,n);

    g=fopen("sdo.out","w");
    fprintf(g,"%d",gasit);
    fclose(g);
    return 0;
}