Cod sursa(job #1791414)

Utilizator medicinedoctoralexandru medicinedoctor Data 29 octombrie 2016 12:50:25
Problema Cautare binara Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <vector>
#include <fstream>

using namespace std;

ifstream cin("cautbin.in");
ofstream cout("cautbin.out");

vector <int> a;
int n,lp,rp,C;

void read()
{
    int q;
    cin >> n;
    a.push_back(-1);
    for (int i=0; i<n; i++)
    {
        cin >> q;
        a.push_back(q);
    }
}

int zero(int l, int r)
{
    if (a[l]==C && a[l+1]>C) return l;
    if (a[r]==C && a[r+1]>C) return r;
    if (lp==l && rp==r) return -1;
    int y=(l+r)/2;
    lp=l; rp=r;
    if (a[y]>C) return zero(l,y); else return zero(y,r);
}

int unu(int l, int r)
{
    if (a[l]<=C && a[l+1]>C) return l;
    if (a[r]<=C && a[r+1]>C) return r;
    if (lp==l && rp==r) return -1;
    int y=(l+r)/2;
    lp=l; rp=r;
    if (a[y]>C) return unu(l,y); else return unu(y,r);
}

int doi(int l, int r)
{
    if (a[l]>=C && a[l-1]<C) return l;
    if (a[r]>=C && a[r-1]<C) return r;
    if (lp==l && rp==r) return -1;
    int y=(l+r)/2;
    lp=l; rp=r;
    if (a[y]>=C) return doi(l,y); else return doi(y,r);
}

void solve()
{
    int x,m;
    cin >> m;
    for ( ; m ; m--)
    {
        lp=-1,rp=-1;
        cin >> x >> C;
        if (x==0) cout << zero(1,n);
        if (x==1) cout << unu(1,n);
        if (x==2) cout << doi(1,n);
        cout << '\n';
    }
}

main()
{
    read();
    solve();
}