Cod sursa(job #917040)

Utilizator R4DIC4LTeodorescu Oana Maria R4DIC4L Data 17 martie 2013 10:21:04
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 3.72 kb
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int t;
long a[100001], n, m, i, k;
int main ()
{
     f >> n;
    for(i = 1; i <= n; i++)
        f >> a[i];
    f >> m;
    for(i = 1; i <= m; i++)
    {
        f >> t >> k;
        long p = 1, q, m, ok = 0;
        q = n;
        if(t == 0)
        {
            while(p <= q || ok == 0)
            {
                m = (p + q)/2;
                if(a[m] < k)
                {
                    q = m - 1;
                }
                else
                    if(a[m] > k)
                    {
                        p = m + 1;
                    }
                    else
                    {
                        if(a[m + 1] == k)
                            p = m + 1;
                        else
                            {
                               ok = 1;
                               break;
                            }
                    }
            }
            if(ok == 1)
            {
                g << m << "\n";
            }
            else
                g << -1 << "\n";
        }
        else
        {
            if(t == 1)
            {

                 while(p <= q || ok == 0)
                {

                    m = (p + q)/2;
                    if(a[m] <= k)
                    {
                        if(a[m + 1] > k)
                            {
                                ok = 1;
                                break;
                            }
                        else
                            p = m + 1;
                    }
                    else
                        if(a[m] > k)
                        {
                            if(a[m - 1] < k)
                                {
                                    ok = 1;
                                    m --;
                                    break;
                                }
                            else
                                q = m - 1;
                        }
                }
                if(ok == 1)
                {
                    g << m << "\n";
                }
                else
                    g << -1 << "\n";
            }
            else
            {
                while(p <= q || ok == 0)
                {
                   m = (p + q)/2;
                    if(a[m] < k)
                    {
                        if(a[m + 1] > k)
                        {
                            ok = 1;
                            m ++;
                            break;
                        }
                        else
                            p = m + 1;
                    }
                    else
                        if(a[m] > k)
                        {
                            if(a[m - 1] < k)
                                {
                                    ok = 1;
                                    break;
                                }
                            else
                                q = m - 1;
                        }
                        else
                        {
                            if(a[m - 1] == k)
                                q = m - 1;
                            else
                                {
                                    ok = 1;
                                    break;
                                }
                        }
                }
                if(ok == 1)
                 {
                    g << m << "\n";
                 }
                else
                    g << -1 << "\n";
            }
        }
    }
    return 0;
}