Cod sursa(job #2661374)

Utilizator goblinupufosPopescu Traian goblinupufos Data 21 octombrie 2020 20:52:21
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.08 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
int sir[100001];

int cautare_binara(int nr) {
    int st = 1;
    int dr = n;
    int m = (st + dr) / 2;

    while (!(st == dr)) {
        if (sir[m] == nr) {
            return m;
        } else if (st < m) {
            st = m + 1;
        } else {
            dr = m - 1;
        }

         m = (st + dr) / 2;

//        cout << st << " " << m << " " << dr << endl;
    }

    return -1;
}

int main() {
    fin >> n;

    for (int i = 1; i <= n; ++i) {
        fin >> sir[i];
    }

    fin >> m;

    for (int i = 1; i <= m; ++i) {
        int t, x;
        fin >> t >> x;

        if (t == 0) {
            int r = cautare_binara(x);

            if (r != -1) {
                int stop = 0;

                while (stop == 0) {
                    if (sir[r + 1] == x && r <= n) {
                        ++r;
                    } else {
                        stop = 1;
                    }
                }

                fout << r << "\n";
            } else {
                fout << -1 << "\n";
            }
        } else if (t == 1) {
            int r = cautare_binara(x);

            if (r == -1) {
                int stop = 0;

                while (stop == 0) {
                    if (x - 1 >= sir[1] && r == -1) {
                        r = cautare_binara(x-1);
                    } else {
                        stop = 1;
                    }
                }

                stop = 0;
                while (stop == 0) {
                    if (sir[r + 1] == x && r <= n) {
                        ++r;
                    } else {
                        stop = 1;
                    }
                }

                fout << r << "\n";
            } else {
                int stop = 0;
                while (stop == 0) {
                    if (sir[r + 1] == x && r <= n) {
                        ++r;
                    } else {
                        stop = 1;
                    }
                }

                fout << r << "\n";
            }
        } else {
            int r = cautare_binara(x);

            if (r == -1) {
                int stop = 0;

                while (stop == 0) {
                    if (x + 1 <= sir[n] && r == -1) {
                        r = cautare_binara(x+1);
                    } else {
                        stop = 1;
                    }
                }

                stop = 0;
                while (stop == 0) {
                    if (sir[r - 1] == x && r >= 1) {
                        --r;
                    } else {
                        stop = 1;
                    }
                }

                fout << r << "\n";
            } else {
                int stop = 0;
                while (stop == 0) {
                    if (sir[r - 1] == x && r >= 1) {
                        --r;
                    } else {
                        stop = 1;
                    }
                }

                fout << r << "\n";
            }
        }

    }

    return 0;
}


//verifica!!!!!!