Cod sursa(job #1308955)

Utilizator danielmaxim95FMI Maxim Daniel danielmaxim95 Data 4 ianuarie 2015 22:10:37
Problema Statistici de ordine Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 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);
        else
            quick(m+1,dr);
    }
    else
        gasit=v[k];
}

int main()
{
    FILE *f,*g;
    int i;
    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;
}