Cod sursa(job #2758825)

Utilizator AlexNicuNicu Alexandru AlexNicu Data 13 iunie 2021 10:46:39
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.75 kb
#include <stdio.h>
#include <stdlib.h>
int v[100001];
int main() {
    FILE *fin,*fout;
    fin=fopen("cautbin.in","r");
    fout=fopen("cautbin.out","w");
    int n,m,i,last,x,st,dr,tip,poz,mij,ultim;
    fscanf(fin,"%d",&n);
    for(i=0; i<n; i++) {
        fscanf(fin,"%d",&v[i]);
        ultim=v[i];
    }
    fscanf(fin,"%d",&m);
    for(i=0; i<m; i++) {
        last=-1;
        fscanf(fin,"%d%d",&tip,&x);
        if(tip==0) {
            st=0;
            dr=n;
            while(st<=dr) {
                mij=(st+dr)/2;
                if(v[mij]<x)
                    st=mij+1;
                else if(v[mij]>x)
                    dr=mij-1;
                else {
                    last=mij;
                    st=mij+1;
                }
            }
            if(last!=-1)
                fprintf(fout,"%d\n",last+1);
            else
                fprintf(fout,"-1\n");
        } else if(tip==1) {
            if(ultim>=x) {
                st=0;
                dr=n;
                while(st<=dr) {
                    mij=(st+dr)/2;
                    if(v[mij]<x)
                        st=mij+1;
                    else if(v[mij]>x)
                        dr=mij-1;
                    else {
                        last=mij;
                        st=mij+1;
                    }
                }
                if(last!=-1)
                    fprintf(fout,"%d\n",last+1);
                else {
                    st=0;
                    dr=n;
                    while(st<=dr) {
                        mij=(st+dr)/2;
                        if(v[mij]<x) {
                            last=mij;
                            st=mij+1;
                        } else if(v[mij]>x)
                            dr=mij-1;
                    }
                    x=v[last];
                    st=0;
                    dr=n;
                    while(st<=dr) {
                        mij=(st+dr)/2;
                        if(v[mij]<x)
                            st=mij+1;
                        else if(v[mij]>x)
                            dr=mij-1;
                        else {
                            last=mij;
                            st=mij+1;
                        }
                    }
                    fprintf(fout,"%d\n",last+1);
                }
            }
            else
                fprintf(fout,"%d\n",n);
        } else if(tip==2) {
            st=0;
            dr=n;
            while(st<=dr) {
                mij=(st+dr)/2;
                if(v[mij]<x) {
                    st=mij+1;
                } else if(v[mij]>x)
                    dr=mij-1;
                else {
                    last=mij;
                    dr=mij-1;
                }
            }
            if(last!=-1)
                fprintf(fout,"%d\n",last+1);
            else {
                st=0;
                dr=n;
                while(st<=dr) {
                    mij=(st+dr)/2;
                    if(v[mij]<x) {
                        st=mij+1;
                    } else if(v[mij]>x) {
                        last=mij;
                        dr=mij-1;
                    }
                }
                x=v[last];
                st=0;
                dr=n;
                while(st<=dr) {
                    mij=(st+dr)/2;
                    if(v[mij]<x) {
                        st=mij+1;
                    } else if(v[mij]>x)
                        dr=mij-1;
                    else {
                        last=mij;
                        dr=mij-1;
                    }
                }
                fprintf(fout,"%d\n",last+1);
            }
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}