Cod sursa(job #916391)

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

    case 1:
            {
                if(a[m] <= k)
                {
                    if(a[m + 1] > k)
                        return m;
                    else
                        return binarySearch(a, m + 1, q, t, k);
                }
                else
                    if(a[m] > k)
                    {
                        if(a[m - 1] < k)
                            return m - 1;
                        else
                            return binarySearch(a, p, m - 1, t, k);
                    }
            }

    case 2:
            {
                if(a[m] < k)
                {
                    if(a[m + 1] > k)
                        return m + 1;
                    else
                        return binarySearch(a, m + 1, q, t, k);
                }
                else
                    if(a[m] > k)
                    {
                        if(a[m - 1] < k)
                            return m;
                        else
                            return binarySearch(a, p, m - 1, t, k);
                    }
                    else
                    {
                        while(a[m - 1] == k)
                            m --;
                        return m;
                    }
            }

    }
}
int main()
{
    f >> n;
    for(i = 1; i <= n; i++)
        f >> a[i];
    f >> m;
    for(i = 1; i <= m; i++)
    {
        f >> t >> k;
        g << binarySearch(a, 1, n, t, k) << "\n";
    }
    return 0;
}