Cod sursa(job #1536512)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 26 noiembrie 2015 12:16:02
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<stdio.h>
#include<algorithm>
#include<iostream>

using namespace std;

FILE *fin,*fout;
int n,k;
int a[3000010];

int ord(int st,int en,int piv,int lf)
{
    //cout<<st<<" "<<en<<" "<<piv<<'\n';
    if(st<en)
    {
        int p1=st-1,p2=en+1;
        while(1)
        {
            do
            {
                p1++;
            }while(a[p1]<a[piv]);

            do
            {
                p2--;
            }while(a[p2]>a[piv]);

            if(p1<p2)
            {
                swap(a[p1],a[p2]);
            }
            else
            {
                break;
            }
        }
        int x=p2-st+1;
        //cout<<x<<'\n';
        if(lf<=x)
        {
            ord(st,p2,(st+p2)/2,lf);
            /*for(int i=1;i<=n;i++)
            {
                fprintf(fout,"%d ",a[i]);
            }
            fprintf(fout,"\n");*/
        }
        else
        {
            ord(p2+1,en,(p2+1+en)/2,lf-x);
            /*for(int i=1;i<=n;i++)
            {
                fprintf(fout,"%d ",a[i]);
            }
            fprintf(fout,"\n");*/
        }
    }
}

int main()
{
    fin=fopen("sdo.in","r");
    fout=fopen("sdo.out","w");

    fscanf(fin,"%d %d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&a[i]);
    }
    int p1=0,p2=n+1;
    int left=k;
    ord(1,n,k,left);
    fprintf(fout,"%d",a[k]);
}