Cod sursa(job #2610375)

Utilizator bogdi1bogdan bancuta bogdi1 Data 4 mai 2020 19:53:11
Problema Statistici de ordine Scor 100
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <ctype.h>
#include <cstdlib>
#include <algorithm>
using namespace std;
int v[3000005];

/** Funcţiile necesare parsării fişierului de intrare **/
FILE *_fin, *fout;
int _in_loc; char _in_buff[4096];


void read_init(const char* nume) // Apelaţi această funcţie la începutul funcţiei <main>
{
	_fin = fopen(nume, "r");
	_in_loc = 4095;
}

char read_ch()
{
	++_in_loc;
	if (_in_loc == 4096) {
		_in_loc = 0;
		fread(_in_buff, 1, 4096, _fin);
	}
	return _in_buff[_in_loc];
}

int read_u32() // Apelaţi această funcţie pentru a citi un număr ce se încadrează în categoria <unsigned int>
{
	int u32 = 0; char c;
	while (!isdigit(c = read_ch()) && c != '-');
	int sgn = 1;
	if (c == '-') {
		sgn = -1;
	} else {
		u32 = c - '0';
	}
	while (isdigit(c = read_ch())) {
		u32 = u32 * 10 + c - '0';
	}
	return u32 * sgn;
}
int sparg_random(int st, int dr)
{
    int pozpivot=rand()%(dr-st+1);
    int pivot=v[st+pozpivot];
    swap(v[st+pozpivot],v[dr]);
    pozpivot=st-1;
    for(int i=st; i<dr; i++)
        if(v[i]<=pivot){
            pozpivot=pozpivot+1;
            swap(v[i], v[pozpivot]);
        }
    swap(v[pozpivot+1], v[dr]);
    return pozpivot+1;
}
int aleg_random(int st, int dr, int poz)
{
    if(st==dr)
        return v[st];
    int k=sparg_random(st, dr);
    if(poz==k-st+1)
        return v[k];
    if(poz<k-st+1)
        return aleg_random(st, k-1, poz);
    else
        return aleg_random(k+1, dr, poz-(k-st+1));
}
int main()
{   fout=fopen("sdo.out", "w");
    int n,k,i;
    srand(12345678);
    read_init("sdo.in");
    n=read_u32();
    k=read_u32();
    for(i=1; i<=n; i++)
        v[i]=read_u32();
    fprintf(fout, "%d", aleg_random(1, n, k));
    return 0;
}