题解 | 【模板】二分

【模板】二分

https://www.nowcoder.com/practice/f06ba3a3008a45e0853f123a28c10836

#include <bits/stdc++.h>
using namespace std;

inline int read(){
    int s =  0,w =  1;char c=  getchar();
    while(!isdigit(c)) w = c  =='-' ? -w :w,c = getchar();
    while(isdigit(c)) s  =  (s<<3) + (s<<1) + c - '0',c = getchar();
    return s * w;
}

inline void out(int x){
    if(x<0) putchar('-'),x =  -x;
    char s[40];int top  =   0;
    do{s[top++]=x%10+'0',x/=10;}while(x);
    while(top) putchar(s[--top]);
    puts("");
}

const int N  =  1e5 + 10;
int n,q,a[N];

int main(){
    n  = read(),q = read();
    for(int i =   0;i<n;a[i++]=read());
    while(q--){
        int op,L,R,x;
        op  = read(),L= read(),R = read(),x = read();
        R--;
        if(op==1){
            //找到第一个大于等于x的
            int l  =  L-1,r =  R+1;
            while(l+1<r){
                int m  =  l + r >> 1;
                if(a[m]>=x) r =  m;
                else l  =  m;
            }
            out(r<=R?a[r]:-1);
        }
        else if(op==2){
            //找到第一个大于x的
            int l  =  L-1,r =  R+1;
            while(l+1<r){
                int m  =   l + r >> 1;
                if(a[m]>x) r =   m;
                else l  =  m;
            }
            out(r<=R?a[r]:-1);
        }
        else if(op==3){
            //找到最后一个小于x的
            int l  =  L-1,r =  R+1;
            while(l+1<r){
                int m  =  l  + r >> 1;
                if(a[m]<x)  l  =   m;
                else r  =  m;
            }
            out(l>=L?a[l]:-1);
        }
        else{
            //找到最后一个小于等于x的
            int l  =  L-1,r =  R+1;
            while(l+1<r){
                int m  =  l + r >> 1;
                if(a[m]<=x) l   =  m;
                else r =   m;
            }
            out(l>=L?a[l]:-1);
        }
    }

    return 0;
}

全部评论

相关推荐

09-22 09:42
门头沟学院 Java
牛客37185681...:马德,我感觉这是我面过最恶心的公司,一面是两个女hr,说什么实习前几个月属于试用期,试用期过了才能转成正式实习生,我***笑了,问待遇就是不说,问能不能接受全栈,沙币公司
如果可以选,你最想去哪家...
点赞 评论 收藏
分享
双尔:反手回一个很抱歉,经过慎重考虑,您与我的预期暂不匹配,感谢您的投递
点赞 评论 收藏
分享
11-17 11:15
门头沟学院 Java
金山办公终于发offer了,但薪资和平台都不如已有的offer打算拒了,A不了薪资,不满意直接拒了,留给需要的人嘿嘿嘿时间线:10.14线下一面&nbsp;,10.23线上二面,下午发测评,11月1日HR面,11月14日电话谈薪,11月17日直接发offer
star__plat...:好兄弟干的好啊,解气。金山第一次笔难度高的离谱,第二次简单的离谱全A了,用人部门筛选中估计最后还是要挂我,就这今早智联招聘还给我发信息让我投
offer帮选
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务