Cod sursa(job #1035738)

Utilizator NitaMihaitavoidcube NitaMihaita Data 18 noiembrie 2013 19:40:58
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#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;
}