Cod sursa(job #2925555)

Utilizator Razvan48Capatina Razvan Nicolae Razvan48 Data 15 octombrie 2022 17:48:08
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <stdlib.h>
#include <time.h>

using namespace std;

const int NMAX = 3000000;

int k;

int v[1 + NMAX];

class Parser
{
private:
  static const int BUFF_SIZE = 5000000;

  ifstream in;

  char buffer[BUFF_SIZE];

  int posBuff;

public:
  Parser(char* file)
  {
    in      = ifstream(file);
    posBuff = BUFF_SIZE - 1;

    ios_base::sync_with_stdio(false);
    in.tie(NULL);
  }

  int getInt()
  {
    int rez = 0;

    while (!('0' <= buffer[posBuff] && buffer[posBuff] <= '9'))
    {
      posBuff++;

      if (posBuff == BUFF_SIZE)
      {
        posBuff = 0;
        in.read(buffer, BUFF_SIZE);
      }
    }

    while ('0' <= buffer[posBuff] && buffer[posBuff] <= '9')
    {
      rez = rez * 10 + buffer[posBuff] - '0';
      posBuff++;

      if (posBuff == BUFF_SIZE)
      {
        posBuff = 0;
        in.read(buffer, BUFF_SIZE);
      }
    }

    return rez;
  }
};

Parser input("sdo.in");

int sol(int st, int dr)
{
    if (st == dr)
        return v[k];
    else
    {
        srand(time(NULL));
        int indexPivot = st + rand() % (dr - st + 1);
        int pivot = v[indexPivot];

        swap(v[indexPivot], v[dr]);

        int stSwap = st - 1;

        for (int i = st; i < dr; i++)
        {
            if (v[i] < pivot)
            {
                stSwap++;
                swap(v[stSwap], v[i]);
            }
        }

        stSwap++;
        swap(v[stSwap], v[dr]);

        if (k == stSwap)
            return v[stSwap];
        else if (k < stSwap)
            return sol(st, stSwap - 1);
        else
            return sol(stSwap + 1, dr);
    }
}

int main()
{
    ofstream out("sdo.out");

    int n;
    n = input.getInt();
    k = input.getInt();

    for (int i = 1; i <= n; i++)
        v[i] = input.getInt();

    out << sol(1, n) << '\n';

    return 0;
}