Cod sursa(job #781988)

Utilizator pongraczlajosLajos Pongracz pongraczlajos Data 25 august 2012 16:04:22
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>
using namespace std;

int v[100002];

// Rendes binaris kereses
int bs(int st, int dr, int k)
{
    int lo, hi, mid;
    lo = st; hi = dr;
    while (lo <= hi)
    {
        mid = lo + (hi - lo) / 2;
        if (v[mid] == k) lo = hi + 1;
        else if (v[mid] < k) lo = mid + 1;
             else hi = mid - 1;
    }
    if (v[mid] == k) return mid;
    else return -1;
}

/**
 Visszateriti azt a legkisebb poziciot, amelynek erteke X. Ha nincs olyan elem, melynek erteke X,
 akkor azt a poziciot teriti vissza, ahova az X erteku elem esne.
*/
int lower(int st, int dr, int k)
{
    int lo, hi, mid;
    lo = st; hi = dr;
    while (lo < hi)
    {
        mid = lo + (hi - lo) / 2;
        if (v[mid] < k) lo = mid + 1;
        else hi = mid;
    }
    return lo;
}

/**
 Visszateriti azt a legnagyobb poziciot, amelynek erteke X. Ha nincs olyan elem, melynek erteke X,
 akkor azt a poziciot teriti vissza, amelyhez az elso, X-tol kisebb ertek tartozik.
 */
int upper(int st, int dr, int k)
{
    int lo, hi, mid;
    lo = st; hi = dr;
    while (lo <= hi)
    {
        mid = lo + (hi - lo) / 2;
        if (v[mid] <= k) lo = mid + 1;
        else hi = mid - 1;
    }
    return hi;
}

int main()
{
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    int n, m, i, t, x, p;
    fin >> n;
    for (i=1; i<=n; i++)
    {
        fin >> v[i];
    }
    fin >> m;
    for (i=1; i<=m; i++)
    {
        fin >> t >> x;
        switch (t)
        {
            case 0:
                p = upper(1, n, x);
                if (v[p] == x) fout << p << '\n'; else fout << -1 << '\n';
                break;
            case 1:
                p = lower(1, n, x+1);
                if (v[p] > x) p--;
                fout << p << '\n';
                break;
            case 2:
                p = upper(1, n, x-1);
                if (v[p] < x) p++;
                fout << p << '\n';
                break;
        }
    }
    fin.close();
    fout.close();
    return 0;
}