Cod sursa(job #1491296)

Utilizator DeltaMTP Dragos DeltaM Data 25 septembrie 2015 01:47:26
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
int n,k,i,j,p,u,mid,v[3001000],x[3001000],y[3001000];
FILE *f,*g;
void chg(int &a,int &b){
    int aux=a;
    a=b;
    b=aux;
}
int sdo(int l,int r){
    int p,u,i,j,a,q;
    p=u=0;
    q=l+rand()%(r-l+1);
    for(i=l;i<=r;i++){
        if(v[i]<v[q])
            x[++p]=v[i];
        else if(v[i]==v[q]){
            x[++p]=v[i];
            a=p;
        }
        else
            y[++u]=v[i];
    }
    chg(x[a],x[p]);
    for(i=l,j=1;i<=r;i++,j++){
        if(j<=p)
            v[i]=x[j];
        else
            v[i]=y[j-p];
    }
    return l+p-1;
}
int main(){
    f=fopen("sdo.in","r");
    g=fopen("sdo.out","w");
    fscanf(f,"%d%d",&n,&k);
    srand(time(0));
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&v[i]);
    }
    p=1;
    u=n;
    while(p<=u){
        mid=sdo(p,u);
        if(mid==k){
            fprintf(g,"%d",v[mid]);
            return 0;
        }
        if(mid<k)
            p=mid+1;
        else
            u=mid-1;
    }



    fclose(f);
    fclose(g);
    return 0;
}