Cod sursa(job #1051855)

Utilizator PsychoAlexAlexandru Buicescu PsychoAlex Data 10 decembrie 2013 17:18:47
Problema Cautare binara Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 3.29 kb
#include <iostream>
#include <fstream>

std::ifstream fin("cautbin.in");
std::ofstream fout("cautbin.out");

int vec[100001], n, m, poz1;

int binSearch(int in, int sf, int val)
{
    int m;
    while(in <= sf)
    {
        m = (in + sf) / 2;
        if(vec[m] < val)
        {
            in = m+1;
        }
        else
            if(vec[m] > val)
            {
                sf = m-1;
            }
            else
            {
                return m;
            }
    }
    m = (in + sf)/2;/// / 2 + sf / 2;
//    if(vec[m] > val)
//    {
//        m--;
//    }
//
//    poz1 = m;

//    if(val == vec[m])
    {
        return m;
    }
//    return -1;
}

void rezolvare(int x, int y)
{
    int raspuns = -1;
    if(x == 0)
    {
        int val = binSearch(0, n-1, y);
        if(vec[val] == y)
        {
            int i = val;
            while(i < n && vec[i] == y)
            {
                i++;
            }
            raspuns = i;
//            fout<<i<<'\n';///il las i, pentru ca trebuie sa afisez pozitia + 1
        }
    }
    else
        if(x == 1)
        {
            int val = binSearch(0, n-1, y);
//            if(vec[val] == y)
            {
                int i = val;
                while(i < n && vec[i] <= y)
                {
                    i++;
                }
                raspuns = i;
//                fout<<i<<'\n';///il las i, pentru ca trebuie sa afisez pozitia + 1
            }
//            else
//            {
//                int i = val;
//                while(i >= 0 && y < vec[i])
//                {
//                    i--;
//                }
//                raspuns = i + 1;
////                fout<<i + 1<<'\n';
//            }
        }
        else
            if(x == 2)
            {
                int val = binSearch(0, n-1, y);
//                if(vec[val] == y)
                {
                    val++;
//                    std::cout<<val<<' ';

//                    fout<<val<<' ';
                    int i = val;
                    int j = i;
                    while(i >= 0 && vec[i] >= y)
                    {
                        j = i;
                        i--;
                    }
//                    i++;
//                    while(i < n && vec[i] >= y)
//                    {
//                        j = i;
//                        i++;
//                    }
                    raspuns = j + 1;
//                    fout<<i + 2<<'\n';///il las i, pentru ca trebuie sa afisez pozitia + 1
                }
//                else
//                {
//                    int i = poz1;
//                    while(i < n && y > vec[i])
//                    {
//                        i++;
//                    }
//                    raspuns = i + 1;
//                    fout<<i + 1<<'\n';
//                }
            }
    fout<<raspuns<<'\n';
}

void citire()
{
    fin>>n;
    for(int i = 0; i < n; i++)
    {
        fin>>vec[i];
    }
    fin>>m;
    int x, y;
    for(int i = 0; i < m; i++)
    {
        fin>>x>>y;
        rezolvare(x, y);
    }
}

void rezolvare()
{
//    fout<<binSearch(0, n-1, 5) + 1;
}

int main()
{
    citire();
    rezolvare();
    return 0;
}