Cod sursa(job #921251)

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

	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[1][m] < k)
                    q = m - 1;
                else
					if(a[1][m] > k)
						p = m + 1;
					else
					{
						m = m - a[2][m] + 1;
						ok = 1;
						break;
					}
            }
        }
        else
        {
            if(t == 1)
            {

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

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