Cod sursa(job #662906)

Utilizator dany123Florea Daniel dany123 Data 17 ianuarie 2012 11:26:21
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
//statistici de ordine, 17.01.2012
#include<iostream>
#include<fstream>
#include<cstdlib>
using namespace std;
const int nmax = 3000001;
int n,k,a[nmax];

int partitie (int st, int dr) //alege un pivot random si pune toate elem < ca el in stanga, iar cele > in dreapta, ajungand in pozitia = statistica sa de ordine, pe care o si returneaza 
{
	
	int i=st-1;
	int j=dr+1; 
	int p=a[st + (rand()%(dr-st+1))]; //pivotul random
	while (5) 
	{
		do { ++i; } while (a[i]<p); //cauta primul elem mai mare ca pivotul (de la st la dr)
		do { --j; } while (a[j]>p); //cauta primul element mai mic ca pivotul (de la dr la st)
		if (i<j) //daca a gasit astfel de elemente (aka n-a ajuns la p)
		{
			int cop=a[i]; a[i]=a[j]; a[j]=cop; //intersch
		}
		else
			return j; //=ordinul (sau ord-1) elementului ales random
	}
}

void selectare(int st, int dr, int k)
{
	if (st==dr)	//partitita mai are doar un element	
		return;
	
	int ord_crt = partitie (st,dr);
	int x = ord_crt - st + 1;
	
	if (x >= k)
		selectare (st,ord_crt,k);
	else
		selectare (ord_crt+1,dr,k-x);
}	

void citire()
{
	ifstream fin ("sdo.in");
	fin>>n>>k;
	for (int i=1;i<=n;++i)
		fin>>a[i];
	fin.close();
}

int main ()
{
	srand(time(NULL));
	
	citire();
	selectare(1,n,k);
	
	ofstream fout("sdo.out");
	fout<<a[k];
	fout.close();
}