Cod sursa(job #672853)

Utilizator voicuraduVoicu Radu voicuradu Data 3 februarie 2012 11:48:59
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 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;
}