Cod sursa(job #2881508)

Utilizator BorodiBorodi Bogdan Borodi Data 30 martie 2022 15:40:12
Problema Barman Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <bitset>
#include <algorithm>
#include <cmath>
#include <stack>
#include <cstring>
#include <queue>
#include <queue>
#define Nmax 1001
using namespace std;

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

typedef vector < int > VI;

VI V[Nmax];
int op, x, q;

struct nod{
    int info, fr, cate;
    nod *st, *dr;
};

void Insert(nod * &A, int x){
    if(A == NULL){
        A = new nod;
        A -> fr = 1;
        A -> cate = 1;
        A -> info = x;
        A -> st = A -> dr = NULL;
    }
    else {
        A -> cate++;

        if(x < A -> info)
            Insert(A -> st, x);
        else
            if(x > A -> info)
                Insert(A -> dr, x);
        else
            if(A -> info == x)
                A -> fr++;
    }
}

int Query(nod *A, int x){
    if(A -> st != NULL){
        if(A -> st -> cate >= x)
            return Query(A -> st, x);
        else
            if(x <= A -> st -> cate + A -> fr)
                return A -> info;
        else return Query(A -> dr, x - (A -> st -> cate + A -> fr));
    }
    else if(A -> fr >= x) return A->info;
    else return Query(A -> dr, x - A -> fr);
}

void SRD(nod *A){
    if(A != NULL) {
        SRD(A -> st);

        for(int i = 1; i <= A -> fr; ++i)
            fout << A -> info << ' ';

        SRD(A -> dr);
    }
}

int main() {
    nod *A = NULL;

    fin >> q;

    while(q--){
        fin >> op >> x;

        if(op == 1)
            Insert(A, x);
        else fout << Query(A, x) << '\n';
    }
    SRD(A);

    return 0;
}