Pagini recente » Cod sursa (job #2672066) | Cod sursa (job #842981) | Cod sursa (job #1594426) | Cod sursa (job #321332) | Cod sursa (job #710727)
Cod sursa(job #710727)
#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)
{
if (endd-beginn==1) return a[beginn];
else if (endd-beginn==2) {
if (k==1) {
if (a[beginn] < a[beginn+1]) return a[beginn];
else return a[beginn+1];
}
if (a[beginn] > a[beginn+1]) return a[beginn];
else return a[beginn+1];
}
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 if (a[dreapta]>pivot) 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;
}