Cod sursa(job #3319704)

Utilizator _.diannaq._Bengescu Diana _.diannaq._ Data 2 noiembrie 2025 18:51:13
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
using namespace std;

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

struct intrb
{
    int nr;
    int val;
};

int cautbin(const vector<int> &v, int x)
{
    int a = 0;
    int b = v.size() - 1;

    while(a <= b)
    {
        int mij = a + (b - a) / 2;
        if(x < v[mij])
        {
            b = mij - 1;
        }
        else if(x > v[mij])
        {
            a = mij + 1;
        }
        else
        {
            return mij;
        }
    }

    return -1;
}

intrb s[100001];

int main()
{
    vector<int> v;
    int n;
    fin >> n;

    for(int i = 0; i < n; i++)
    {
        int a;
        fin >> a;
        v.push_back(a);
    }

    int m;
    fin >> m;
    for(int i = 1; i <= m; i++)
    {
        fin >> s[i].nr >> s[i].val;

        if(s[i].nr == 0)
        {
            int a = cautbin(v, s[i].val);
            if(a != -1)
            {
                while(a + 1 < n && v[a + 1] == s[i].val)
                    a++;
            }
            fout << a+1 << '\n';
        }
        else if(s[i].nr == 1)
        {
            // cea mai mare pozitie cu valoare <= val
            int l = 0, r = n - 1, ans = -1;
            while(l <= r)
            {
                int mid = l + (r - l) / 2;
                if(v[mid] <= s[i].val)
                {
                    ans = mid;
                    l = mid + 1;
                }
                else
                    r = mid - 1;
            }
            fout << ans+1 << '\n';
        }
        else
        {
            // nr == 2, cea mai mica pozitie cu valoare >= val
            int l = 0, r = n - 1, ans = -1;
            while(l <= r)
            {
                int mid = l + (r - l) / 2;
                if(v[mid] >= s[i].val)
                {
                    ans = mid;
                    r = mid - 1;
                }
                else
                    l = mid + 1;
            }
            fout << ans+1<< '\n';
        }
    }
}