Cod sursa(job #2478009)

Utilizator gabimoiseMoise Gabriel gabimoise Data 21 octombrie 2019 15:02:02
Problema Cautare binara Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;

int a[100010],n;

long task_0 (long x)
{
    long l = 0, r = n;
    // a[0..l) <= x < a[r..n) && l < r
    while (l < r)
    {
        long m = (l+r)/2;
        if (x >= a[m]) l = m+1;
        else r = m;
    }
    // l == r => a[0..l) <= x < a[l..n), so we return (l-1)+1 if a[l-1] = x and (-1) otherwise
    if (a[l-1] == x) return l;
    else return (-1);
}

long task_1(long x)
{
    long l = 0, r = n;
    // a[0..l) <= x < a[r..n) && l < r
    while (l < r)
    {
        long m = (l+r)/2;
        if (x >= a[m]) l = m+1;
        else r = m;
    }
    // l == r => a[0..l) <= x < a[l..n), so we return (l-1)+1 if a[l-1] = x and (-1) otherwise
    return l;
}

long task_2(long x)
{
    long l = 0, r = n;
    // a[0..l) < x <= a[r..n) && l < r
    while (l < r)
    {
        long m = (l+r)/2;
        if (x > a[m]) l = m+1;
        else r = m;
    }
    // l == r => a[0..l) < x <= a[l..n), so we return (l-1)+1 if a[l-1] = x and (-1) otherwise
    return (l+1);
}

int main()
{
    long M,i,q,x,task;
    ifstream in ("cautbin.in");
    ofstream out ("cautbin.out");
    in >> n ;
    for (i = 0 ; i < n; i++) in >> a[i];
    in >> M ;
    for (q = 0 ; q < M ; q ++)
    {
        in >> task >> x;
        if (task == 0) out << task_0(x) << endl;
        else if (task == 1) out << task_1(x) << endl;
        else out << task_2(x) << endl;

    }
    return 0;
}