Cod sursa(job #374095)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 15 decembrie 2009 22:36:48
Problema Statistici de ordine Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#define infile "sdo.in"
#define outfile "sdo.out"
#define nmax (3000*1000+1)
#define smax (1<<16)
char s[smax]; //vectorul in care parsam citirea
int v[nmax]; //vectorul cu numerele
int n; //numarul de numere
int k; //trebuie sa aflam a k-a valoare din vectorul sortat

void swap(int *a, int *b)
{
	int c=*a; *a=*b; *b=c;
}

void read()
{
	int i,j;
	scanf("%d %d\n",&n,&k);
	fread(s,1,smax,stdin);
	for(i=0,j=1;j<=n;j++)
	{
		//sarim peste caracterele proaste
		while(s[i]<'0' || s[i]>'9')
			if(++i==smax)
				fread(s,1,smax,stdin),i=0;
		
		//construim numarul
		while(s[i]>='0' && s[i]<='9')
		{
			v[j]=v[j]*10+s[i]-'0';
			if(++i==smax)
				fread(s,1,smax,stdin),i=0;
		}
	}
}

int divide(int st, int dr)
{
	//alegem ca pivot o valoare random
	swap(&v[st],&v[st+(rand()%(dr-st+1))]);
	
	int x=v[st];
	while(st<dr)
	{
		while(st<dr && v[dr]>=x) dr--;
		v[st]=v[dr];
		while(st<dr && v[st]<=x) st++;
		v[dr]=v[st];
	}
	v[st]=x;
	return st;
}

void sqsort(int st, int dr, int poz)
{
	int mij=divide(st,dr);
	int dif=mij-st+1;
	
	if(poz<dif) sqsort(st,mij-1,poz);
	else if(poz>dif) sqsort(mij+1,dr,poz-dif);
}

void write()
{
	printf("%d\n",v[k]);
}

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	read();
	sqsort(1,n,k);
	write();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}