Cod sursa(job #1760366)

Utilizator MasurceacMasurceac Serghei Masurceac Data 20 septembrie 2016 18:39:55
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
using namespace std;
ofstream rez("cautbin.out");
ifstream inf("cautbin.in");

int *a, n, steps, step, lastpoz;


citire() {
    inf>>n;
    for (int i=0; i<n; i++)
        inf>>a[i];
}

int caut_bin(int st, int dr) {
    if (a[dr] == step) return dr;
    if (a[st] == step) return st;
    if (st==dr) return -1;
    int m = (st + dr) / 2;
    lastpoz = m;
    if (a[m]>=step) return caut_bin(m,dr);
    if (a[m]<=step) return caut_bin(st,m);

}

int step_0(int poz) {
    if (poz<0) return -1;
    int val = a[poz];
    for (int i=poz; i<n; i++) {
        if (a[i]!=val) return i-1;
    }
}

int step_1() {
    int exists = caut_bin(0, n);
    if (exists>=0) {
        return step_0(exists);
    } else {
        for (int i=lastpoz; i>=0; i--)
            if (a[i]<step) return a[i];
    }
}

int step_2() {
    int exists = caut_bin(0, n);
    if (exists>=0) {
        for (int j=0; j<=exists; j++)
            if (a[j]==a[exists]) return j;
    } else {
        for (int i=lastpoz; i<n; i++)
            if (a[i]>step) return a[i];
    }
}

int main(){
    a = new int;
    int condition;
    citire();

    inf>>steps;
    for (int j=0; j<steps; j++) {
        inf>>condition;
        inf>>step;
        switch (condition) {
        case 0: rez<<step_0(caut_bin(0,n))+1<<endl; break;
        case 1: rez<<step_1()+1<<endl; break;
        case 2: rez<<step_2()+1; break;
        }
    }

    rez.close();
    inf.close();
    return 0;
}