Cod sursa(job #976780)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 23 iulie 2013 22:36:34
Problema Cautare binara Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include<fstream>
using namespace std;

int n,a[100005],b[100005][3],m;

int main()
{
    int i,st,dr,mij,x,y;
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    fin>>n;
    for (i=1;i<=n;i++)
        fin>>a[i];
    fin>>m;
    for (i=1;i<=m;i++)
        {fin>>x>>y;
         if (x==0)
            {st=1;dr=n;
             mij=(st+dr)/2;
             while (st<dr && a[mij]!=y)
                {if (a[mij]<y)
                    st=mij+1;
                 if (a[mij]>y)
                    dr=mij-1;
                 mij=(st+dr)/2;
                }
             while (st<dr && a[mij+1]==y)
                {if (a[mij]>y)
                    dr=mij-1;
                 else st=mij+1;
                 mij=(st+dr)/2;
                }
             if (st<dr)
             fout<<mij<<"\n";
             else fout<<"-1"<<"\n";
            }
         if (x==1)
            {st=1;dr=n;
             mij=(st+dr)/2;
             while (st<dr && a[mij]!=y)
                {if (a[mij]<y)
                    st=mij+1;
                 if (a[mij]>y)
                    dr=mij-1;
                 mij=(st+dr)/2;
                }
             while (st<dr && a[mij+1]==y)
                {if (a[mij]>y)
                    dr=mij-1;
                 else st=mij+1;
                 mij=(st+dr)/2;
                }
              if (st<dr)
             fout<<mij<<"\n";
             else if (a[mij]>y) fout<<mij-1<<"\n";
             else fout<<mij<<"\n";
            }
         if (x==2)
            {st=1;dr=n;
             mij=(st+dr)/2;
             while (st<dr && a[mij]!=y)
                {if (a[mij]<y)
                    st=mij+1;
                 if (a[mij]>y)
                    dr=mij-1;
                 mij=(st+dr)/2;
                }
             while (st<dr && a[mij-1]==y)
                {if (a[mij]>y)
                    st=mij+1;
                 else dr=mij-1;
                 mij=(st+dr)/2;
                }
             if (a[mij]<y) fout<<mij+1<<"\n";
             else fout<<mij<<"\n";
            }
        }
    fin.close();
    fout.close();
    return 0;
}