二分探索用vector

使い方は普通のvectorと同じ

lb = lower_bound

up = upperbound

ika = 以下

mim = 未満

結果がイテレータではなく添字で帰ってくる

end() に相当するリターンは-1

X ~ Y の間にある個数を数えたいときは ub(Y) - lb(X)


class bs{
    public : 
    vector<long long> v;
    bs(long long n,long long x){
        v.assign(n,x);
        return;
    }
    void sort(){
        std::sort(v.begin(),v.end());
    }
    long long& at(long long pos){
        return v[pos];
    }
    long long& operator[](long long pos){
        return v[pos];
    }
    const long long& operator[](long long pos) const{
        return v[pos];
    }
    void push_back(long long x){
        v.push_back(x);
    }
    void pop_back(){
        v.pop_back();
    }
    long long lb(long long x){
        auto it = lower_bound(v.begin(),v.end(),x);
        if(it == v.end()){
            return -1;
        }
        else{
            return it - v.begin();
        }
    }
    long long ub(long long x){
        auto it = upper_bound(v.begin(),v.end(),x);
        if(it == v.end()){
            return -1;
        }
        else{
            return it - v.begin();
        }
    }
    long long mim(long long x){
        auto it = lower_bound(v.begin(),v.end(),x);
        if(it == v.begin()){
            return -1;
        }
        else{
            --it;
            return it - v.begin();
        }
    }
    long long ika(long long x){
        auto it = upper_bound(v.begin(),v.end(),x);
        if(it == v.begin()){
            return -1;
        }
        else{
            --it;
            return it - v.begin();
        }       
    }
    long long cnt_ika(long long x){
        return ika(x)+1;
    }
    long long cnt_mim(long long x){
        return mim(x)+1;
    }
    long long cnt_lb(long long x){
        if(lb(x) == -1){
            return 0;
        }
        return v.size() - lb(x);
    }
    long long cnt_ub(long long x){
        if(ub(x)==-1){
            return 0;
        }
        return v.size() - ub(x);
    }
};