Cod sursa(job #673225)

Utilizator razvan2006razvan brezulianu razvan2006 Data 4 februarie 2012 09:12:23
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,k,v[3000010];
void read()
{
    int i;
    freopen("sdo.in","r",stdin);
    freopen("sdo.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
    scanf("%d",&v[i]);
}

void sch(int &a,int &b)
{
    int aux;
    aux=a;
    a=b;
    b=aux;
}

int partitie(int st, int dr)
{
    int i,j,piv;
    piv=st+rand()%(dr-st+1);
    sch(v[piv],v[dr]);
    for(i=j=st;i<dr;i++)
        if(v[i]<v[dr])
            sch(v[i],v[j++]);
    sch(v[j],v[dr]);
    return j;
}

int sdo(int st, int dr)
{
    int val,x;
    if(st == dr) return v[st];
    if(st>dr)
        return 0;
    val=partitie(st,dr);
    if(val==k)
        return v[val];
    if(k<val)
        x=sdo(st,val-1);
    else
        x=sdo(val+1,dr);
    return x;
}


void rez()
{
    int val;
    val=sdo(1,n);
    printf("%d\n",val);
}

int main()
{
    read();
    rez();
    return 0;
}