Cod sursa(job #710719)

Utilizator Dragan_ValentinDragan Valentin Dragan_Valentin Data 10 martie 2012 17:09:52
Problema Statistici de ordine Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <iostream>
#include <cstdlib>

using namespace std;

int n;
int a[3000000];
int aux;

// Searches the k'th element in the vector a[]
int search(int k,int a[3000000],int beginn,int endd)
{
	
	int i;
	// Choosing a pivot at random 
	int pivot_pos=beginn+(rand()%(endd-beginn));
	int pivot=a[pivot_pos];
	//cout<<"PIVOT:"<<pivot<<'\n';
	// Putting the pivot on the first position of the array
	aux=a[beginn];
	a[beginn]=pivot;
	a[pivot_pos]=aux;
	int stanga=beginn+1;
	int dreapta=endd-1;
	while (stanga < dreapta) {
		while (a[stanga] <= pivot && stanga < dreapta) ++stanga;
		while (a[dreapta] > pivot && stanga < dreapta) --dreapta;
		if (stanga < dreapta) {
			aux=a[stanga];
			a[stanga]=a[dreapta];
			a[dreapta]=aux;
		}
		else dreapta--;
	}
	aux=a[beginn];
	a[beginn]=a[dreapta];
	a[dreapta]=aux;
	/*cout<<"LOWER :"<<dreapta-beginn+1<<'\n';
	for (i=beginn; i<=dreapta; i++)
		cout<<a[i]<<' ';
	cout<<'\n';
	cout<<"BIGGER :"<<endd-dreapta-1<<'\n';
	for (i=dreapta+1; i<endd; i++)
		cout<<a[i]<<' ';
	cout<<'\n';*/
	//cout<<k-(dreapta-beginn+1)<<"k-(dreapta-beggin) "<<'\n';
	if (k<dreapta-beginn+1) return search(k,a,beginn,dreapta);
	if (k>dreapta-beginn+1) return search(k-(dreapta-beginn+1),a,dreapta+1,endd);
	else return pivot;
}
	



int main()
{
	int k,i;
	ifstream f("sdo.in");
	f>>n>>k;
	for (i=0; i<n; i++)
		f>>a[i];
	f.close();
	int k_number=search(k,a,0,n);
	ofstream g("sdo.out");
	g<<k_number;
	g.close();
	return 0;
}