Cod sursa(job #2739111)

Utilizator uclaudiu7Ursescu Claudiu uclaudiu7 Data 6 aprilie 2021 20:45:24
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

#define FI first
#define SE second
#define MP make_pair
#define PB push_back
#define PPB pop_back
#define FOREACH(it, v) for(auto it = v.begin(); it != v.end(); it++)
#define ALL(v) a.begin(), a.end()
#define FO(i, x, n) for(int i = x; i < n; ++i)
#define F0(i, n) for(int i = 0; i < n; ++i)
#define RF(i, n, k) for(int i = n-1; i >= k; --i)
#define FOI(i, x, n, in) for(int i = x; i < n; i += in)
#define RFOI(i, x, n, in) for(int i = x; i >= n; i -= in)
#define Sonic ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);

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

int RBS(vector<int> v, int l, int r, int x){
    if(r >= l){
        int mid = (l+r)/2;

        if(v[mid] == x && v[mid+1] != x)
            return mid;

        if(v[mid] > x)
            return RBS(v, l, mid-1, x);
        return RBS(v, mid+1, r, x);
    }
    return -1;
}

int BS(vector<int> v, int l, int r, int x){
    if(r >= l){
        int mid = (l+r)/2;

        if(v[mid] == x && v[mid-1] != x)
            return mid;

        if(v[mid] < x)
            return BS(v, mid+1, r, x);
        return BS(v, l, mid-1, x);
    }
    return -1;
}

int main()
{
    Sonic;
    int n, m, t, x;
    fin >> n;
    vector < int > v(n);
    F0(i,n)
        fin >> v[i];
    fin >> m;
    while(m--){
        fin >> t >> x;
        if(t == 0)
            fout << RBS(v, 0, n-1, x) + 1 << endl;
        if(t == 1){
            while(RBS(v, 0, n-1, x) == -1)
                x--;
            fout << RBS(v, 0, n-1, x) + 1 << endl;
        }
        if(t == 2){
            while(BS(v, 0, n-1, x) == -1)
                x++;
            fout << BS(v, 0, n-1, x) + 1 << endl;
        }
    }
    return 0;
}