Cod sursa(job #2682365)

Utilizator CaptnBananaPetcu Tudor CaptnBanana Data 8 decembrie 2020 16:32:14
Problema Cautare binara Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("cautbin.in");
ofstream g("cautbin.out");

int solve0(int x, int v[], int lo, int hi){
    int m;

    while(lo <= hi){
        m = (lo + hi)/2;
        if(v[m] <= x){
            lo = m + 1;
        }else{
            hi = m - 1;
        }
    }
    m = (hi + lo)/2;

    if(v[m] > x){
        m--;
    }
    if(v[m]==x){
        return m+1;
    }
    return -1;
}

int solve1(int x, int v[], int lo, int hi){
    int m, lo1, hi1;

    for(;;x--){
        lo1 = lo;
        hi1 = hi;
        while(lo1 <= hi1){
            m = (lo1 + hi1)/2;
            if(v[m] <= x){
                lo1 = m + 1;
            }else{
                hi1 = m - 1;
            }
        }
        m = (hi1 + lo1)/2;

        if(v[m] > x){
            m--;
        }
        if(v[m]==x){
            return m+1;
        }
    }
}

int solve2(int x, int v[], int lo, int hi){
    int m;

    while(lo < hi){
        m = (lo + hi)/2;
        if(v[m] < x){
            lo = m + 1;
        }else{
            hi = m;
        }
    }

    m = (lo + hi)/2;
    if(v[m] < x){
        m++;
    }
    return m+1;
}

int main(){
    int n, m;

    f >> n;
    int v[n];
    for(int i = 0; i < n; i++){
        f >> v[i];
    }

    f >> m;
    while(m--){
        int x, tip;
        f >> tip >> x;
        if(tip == 0){
            g << solve0(x, v, 0, n-1);
        }else if(tip == 1){
            g << solve1(x, v, 0, n-1);
        }else{
            g << solve2(x-1, v, 0, n-1);
        }

        if(!m){
            break;
        }
        g << "\n";
    }
}