Cod sursa(job #2581708)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 15 martie 2020 17:48:26
Problema Radix Sort Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define MAX 100000
using namespace std;

int n, log2N;
long long v[MAX + 5];

void precalculare()
{
    for(log2N = 1; (log2N << 1) <= n; log2N <<= 1);
}

int bin0(long long x)
{
    int p;

    int poz = 0;
    for(p = log2N; p; p >>= 1)
        if(poz + p <= n && v[poz + p] <= x)
            poz += p;

    if(v[poz] == x)return poz;
    return -1;
}

int bin1(long long x)
{
    int p;

    int poz = 0;
    for(p = log2N; p; p >>= 1)
        if(poz + p <= n && v[poz + p] <= x)
            poz += p;

    return poz;
}

int bin2(long long x)
{
    int p;

    int poz = 0;
    for(p = log2N, poz = n; p; p >>= 1)
        if(poz - p > 0 && v[poz - p] >= x)
            poz -= p;

    return poz;
}

int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");

    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    srand(time(NULL));

    fin >> n;

    for(int i = 1; i <= n; i++)
        fin >> v[i];

    precalculare();
    int m;
    fin >> m;

    for(int i = 1; i <= m; i++)
    {
        int c;
        long long a;

        fin >> c >> a;

        if(c == 0)fout << bin0(a) << '\n';
        else if(c == 1)fout << bin1(a) << '\n';
        else fout << bin2(a) << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}