Pagini recente » Cod sursa (job #2476807) | Istoria paginii runda/simulare_oji_2023_clasele_11_12_15_martiee/clasament | Cod sursa (job #2843625) | Cod sursa (job #2869896) | Cod sursa (job #662904)
Cod sursa(job #662904)
//statistici de ordine, 17.01.2012
#include<iostream>
#include<fstream>
#include<ctime>
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();
}