Cod sursa(job #1559105)

Utilizator geni950814Geni Geni geni950814 Data 30 decembrie 2015 06:52:51
Problema Cautare binara Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#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;
        }
    }
   
    if(V[start] <= n) {
        result = start;
    }

    return result+1;
}

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() {
    freopen("cautbin.in", "r", stdin);
    freopen("cautbin.out", "w", stdout);
    scanf("%d", &SIZE);

    vector<int> V(SIZE);

    for(int i = 0; i < SIZE; i++){
        scanf("%d", &V[i]);
    }
   
    scanf("%d", &Q); 
    int q, n;
    for(int i = 0; i < Q; i++) {
        scanf("%d %d", &q, &n);
        if(q == 0) {
            printf("%d\n", MaxPos(V, n));
        } else if(q == 1) {
            printf("%d\n", LessThan(V, n));
        } else if(q == 2) {
            printf("%d\n", BiggerThan(V, n));
        }
    }

    return 0;
}