Cod sursa(job #3294454)

Utilizator Sorin_GabrielGabara Sorin Gabriel Sorin_Gabriel Data 23 aprilie 2025 19:15:54
Problema Statistici de ordine Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define VMAX 102
#define INF 2000000000
using namespace std;
ifstream fin ("sdo.in");
ofstream fout ("sdo.out");

vector<int> num;

int n_th_element(vector<int> numere, int cautat) // cautam al x-lea element din vectorul numere
{
    int pivot = rand()%numere.size(); // alegem un pivot la nimereala
    vector<int> mai_mic, mai_mare; // vectorii cu numerele mai mici, respectiv mai mari
    int nr_egali=0; // daca sunt mai multe numere egale cu pivotul
    for(int i=0;i<numere.size();i++)
    {
        if(numere[i]<numere[pivot])
            mai_mic.push_back(numere[i]);
        else if(numere[i]>numere[pivot])
            mai_mare.push_back(numere[i]);
        else // numere[i] == numere[pivot]
            nr_egali++;
    }
    if(cautat<mai_mic.size())
        return n_th_element(mai_mic, cautat); // numarul cautat e mai mic, deci e in vectorul acesta
    else if(cautat<mai_mic.size() + nr_egali) // cautat e mai mare decat nr de numere mai mici si e <= decat numarul de numere cu tot cu cel ales
        return numere[pivot]; // am gasit numarul
    else
        return n_th_element(mai_mare, cautat - mai_mic.size() - nr_egali); // numarul e mai mare, deci va fi al x-lea - cate numere sunt inaintea grupei

}

int main()
{
    int n,m,i,j,k,t,q,nr,minim,maxim,suma;
    fin>>n>>m;
    for(i=0;i<n;i++)
    {
        fin>>j;
        num.push_back(j);
    }
    srand(time(0));
    fout<<n_th_element(num,m-1)<<'\n'; // m-1 pentru ca vectorii vor fi indexati de la 0, nu de la 1


    return 0;
}