Cod sursa(job #1559077)

Utilizator geni950814Geni Geni geni950814 Data 30 decembrie 2015 00:40:40
Problema Cautare binara Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <vector>

using namespace std;

int SIZE, Q;

int MaxPos(const vector<int>& V, int n) {
    int maxPos = -1;

    int start = 0;
    int end = SIZE;

    while(start < end) {
        int middle = (start+end)/2;
        if(V[middle] <= n) {
            start = middle+1;
            if(V[middle] == n) {
                maxPos = middle;
            }
        } else {
            end = middle;
        }
    }
    
    if(maxPos < 0) {
        return maxPos;
    }
    return maxPos+1;    
}


int LessThan(const vector<int>& V, int n) {
    int start = 0;
    int end = SIZE;
    int result = 0;
    while(start < end) {
        int middle = (start+end)/2;
        if(V[middle] <= n) {
            result = middle;
            start = middle+1;
        } else {
            end = middle;
        }
    }
    
    return start;
}

int BiggerThan(const vector<int>& V, int n) {
    int start = 0;
    int end = SIZE;
    int result = SIZE-1;
    while(start < end) {
        int middle = (start+end)/2;
        if(V[middle] >= n) {
            end = middle;
            result = middle;
        } else {
            start = middle+1;
        }
    }

    if(V[start] >= n) {
        result = start;
    }

    return result+1;
}
    
int main() {
    
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");

    f >> SIZE;

    vector<int> V;

    for(int i = 0; i < SIZE; i++){
        int elem;
        f >> elem;
        V.push_back(elem);
    }
    
    f >> Q;

    for(int i = 0; i < Q; i++) {
        int q;
        int n;
        f >> q >> n;
        if(q == 0) {
            g << MaxPos(V,n) << endl;
        } else if(q == 1) {
            g << LessThan(V, n) << endl;
        } else if(q == 2) {
            g << BiggerThan(V, n) << endl;
        }
    }

    return 0;
}