Cod sursa(job #3294457)

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

vector<int> numere;
vector<int> mai_mic, mai_mare; // vectorii cu numerele mai mici, respectiv mai mari

int n_th_element(int cautat) // cautam al x-lea element din vectorul numere
{
    int pivot = rand()%numere.size(); // alegem un pivot la nimereala
    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())
    {
        numere = mai_mic;
        mai_mic.clear(); //stergem toate elementele din vectori
        mai_mare.clear(); // -//-
        return n_th_element(cautat); // numarul cautat e mai mic, deci e in vectorul mai mic
    }
    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
    {
        numere = mai_mare;
        mai_mic.clear();
        mai_mare.clear();
        return n_th_element(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;
        numere.push_back(j);
    }
    srand(5);
    fout<<n_th_element(m-1)<<'\n'; // m-1 pentru ca vectorii vor fi indexati de la 0, nu de la 1


    return 0;
}