Cod sursa(job #3315355)

Utilizator zionlyismAdobroaiei David zionlyism Data 13 octombrie 2025 22:06:09
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <cstdlib>
#define NMAX 30000002

using namespace std;

ifstream fin ("sdo.in");
ofstream fout("sdo.out");

int n, k;
long long int a[NMAX];

long long int qselect(int st, int dr);
int Divide(int st, int dr);

int main()
{
    int i;
    fin>>n>>k;
    for(i = 1; i <= n ;i++)
        fin>>a[i];
    srand(1023);
    fout<<qselect(1, n)<<'\n';
    return 0;
}

long long int qselect(int st, int dr)
{
 if (st <= dr)
    {
     int poz = Divide(st, dr);
     if(poz == k)
        {return a[poz];}
        else
        if(k > poz)
           return qselect(poz + 1, dr);
     return qselect(st, poz - 1);
     //excludem poz pentru ca aceea este pozitia pivotului(corecta in vectorul mare)
    }
}

int Divide(int st, int dr)
{
 long long int pivot;
 int poz;
 poz = st + rand()%(dr - st + 1);
 pivot = a[st]; a[st] = a[poz]; a[poz] = pivot;
 pivot = a[st];
 while(st < dr)
    {//initial am liber la stanga, deci caut un element in dreapta care trebuie mutat
     while(st < dr && a[dr] >= pivot)
         dr--;
     //mut elementul din dreapta la stanga
     a[st] = a[dr];
     //am liber la dreapta, deci caut in stanga un element care trebuie mutat
     while(st < dr && a[st] <= pivot)
        st++;
     //mut elementul din stanga la dreapta
     a[dr] = a[st];
    }
 a[st] = pivot;
 return st;
}