Cod sursa(job #1732598)

Utilizator medicinedoctoralexandru medicinedoctor Data 21 iulie 2016 23:56:59
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <iostream>

using namespace std;

int n,m,a[100000],r,t;
ofstream e("cautbin.out");
ifstream f("cautbin.in");

int init()
{
    f >> n;
    for (int i=1; i<=n; i++)
        f >> a[i];
    f >> m;
}

void right(int x)
{
     int w=a[x],q=x;
     for (int i=x; i<=n; i++)
         if (a[i+1]!=w) break; else q=i+1;
     e << q << endl;
}

void zero(int x, int l, int r)
{
     int m=(r+l)/2;
     if ((l==r) & (a[l]!=x)) e << -1 << endl; else
     if (a[r]==x) right(r); else
     if (a[m]==x) right(m); else
     if (a[l]==x) right(l); else
     if (a[m]>x) zero(x,l,m); else zero(x,m,r);
}

void unu(int x, int l, int r)
{
     int m=(l+r)/2;
     if (l==r) right(l); else
     if (a[m]==x) right(m); else
     if (a[r]==x) right(r); else
     if (a[l]==x) right(l); else
     if (a[m]>x) unu(x,l,m); else unu(x,m,r);
}

void left(int x)
{
     int w=a[x],q=x;
     for (int i=x; i>=1; i--)
         if (a[i-1]!=w) break; else q=i-1;
     e << q << endl;
}

int qwerty=1;

void doi(int x, int l, int r)
{
     cout << qwerty << endl;
     qwerty++;
     int m=(l+r)/2;
     if (l==r) left(l); else
     if (a[m]==x) left(m); else
     if (a[r]==x) left(r); else
     if (a[l]==x) left(l); else
     if (a[m]>x) doi(x,m,r); else doi(x,l,m);
}

int main()
{
    init();
    for (int i=1; i<=m; i++)
    {
        f >> r >> t;
        if (r==0) zero(t,1,n);
        if (r==1) unu(t,1,n);
        if (r==2) doi(t,1,n);
    }
    f.close();
    e.close();
    return 0;
}