Pagini recente » Cod sursa (job #2141906) | Cod sursa (job #1464877) | Cod sursa (job #108396) | Cod sursa (job #306253) | Cod sursa (job #1035738)
#include<fstream>
#include<ctime>
#include<stdlib.h>
#define numaru 3000000
using namespace std;
int v[numaru+1],n,k;
void schimba(int &a,int &b)
{
a=(a+b)-(b=a);
}
int GetRandomVal(int i,int j)
{
int a,b,c,tempa,tempb,tempc;
if(j-i==2) { a=i;b=i+1; c=i+2; }
else
{
a=rand()%(j-i)+i+1;
do { b=rand()%(j-i)+i+1; }while(a==b);
do { c=rand()%(j-i)+i+1; }while(c==a || c==b);
tempa=v[a];tempb=v[b];tempc=v[c];
if(tempa>tempb) { schimba(tempa,tempb); schimba(a,b);}
if(tempa>tempc) { schimba(tempa,tempc); schimba(a,c); }
if(tempb>tempc) { schimba(tempb,tempc); schimba(b,c); }
}
return b;
}
int F(int i,int j)
{
int x,poz,copie_i,copie_j;
while(true)
{
if(i==j)return v[i];
copie_i=i; copie_j=j;
//if(j-i>1)poz=GetRandomVal(i,j);
//else poz=i;
x=v[poz=i];
while(i<j)
{
while(v[i]<x)++i;
while(x<v[j])--j;
if(i<j) schimba(v[i],v[j]);
}
if(k==j)return v[j];
else if(k>j) { i=j+1;j=copie_j;}
else { i=copie_i; j=j-1; }
}
}
int main()
{
srand(time(0));
ifstream f("sdo.in");
ofstream g("sdo.out");
int i,r;
f>>n>>k;
for(i=1;i<=n;++i)
f>>v[i];
r=F(1,n);
g<<r<<"\n";
f.close();
g.close();
return 0;
}