Cod sursa(job #392794)

Utilizator RobybrasovRobert Hangu Robybrasov Data 8 februarie 2010 12:22:08
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <cstdlib>
#define N 3000005
#define S_MAX 65536

int A[N];
int p=-1;
char S[S_MAX];

int poz(int a, int b, int k)
{
    int t,x=a,y=b,r=a+rand()%(b-a+1);
    t=A[a]; A[a]=A[r]; A[r]=t;
    for (int i=0, j=-1; x<y; x+=i, y+=j)
        if (A[x]>A[y])
        {
            t=A[x]; A[x]=A[y]; A[y]=t;
            t=i; i=-j; j=-t;
        }

    if (x==k) return A[k];
    if (x<k) return poz(x+1,b,k);
    return poz(a,x-1,k);
}

void read(int &x)
{
	x=0;
	for (; S[p]<'0' || S[p]>'9'; ++p)
		if (p==S_MAX-1)
		{
			fread(S,1,S_MAX,stdin);
			p=-1;
		}

	for (; S[p]>='0' && S[p]<='9'; ++p)
	{
		x=10*x+S[p]-'0';
		if (p==S_MAX-1)
		{
			fread(S,1,S_MAX,stdin);
			p=-1;
		}
	}
}

int main()
{
    int n,k;
	freopen("sdo.in","r",stdin);
	freopen("sdo.out","w",stdout);
	fread(S,1,S_MAX,stdin);
	read(n); read(k);
    for (int i=1; i<=n; i++) read(A[i]);

    printf("%d",poz(1,n,k));

    return 0;
}