Cod sursa(job #917040)
Utilizator | Data | 17 martie 2013 10:21:04 | |
---|---|---|---|
Problema | Cautare binara | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.72 kb |
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");
int t;
long a[100001], n, m, i, k;
int main ()
{
f >> n;
for(i = 1; i <= n; i++)
f >> a[i];
f >> m;
for(i = 1; i <= m; i++)
{
f >> t >> k;
long p = 1, q, m, ok = 0;
q = n;
if(t == 0)
{
while(p <= q || ok == 0)
{
m = (p + q)/2;
if(a[m] < k)
{
q = m - 1;
}
else
if(a[m] > k)
{
p = m + 1;
}
else
{
if(a[m + 1] == k)
p = m + 1;
else
{
ok = 1;
break;
}
}
}
if(ok == 1)
{
g << m << "\n";
}
else
g << -1 << "\n";
}
else
{
if(t == 1)
{
while(p <= q || ok == 0)
{
m = (p + q)/2;
if(a[m] <= k)
{
if(a[m + 1] > k)
{
ok = 1;
break;
}
else
p = m + 1;
}
else
if(a[m] > k)
{
if(a[m - 1] < k)
{
ok = 1;
m --;
break;
}
else
q = m - 1;
}
}
if(ok == 1)
{
g << m << "\n";
}
else
g << -1 << "\n";
}
else
{
while(p <= q || ok == 0)
{
m = (p + q)/2;
if(a[m] < k)
{
if(a[m + 1] > k)
{
ok = 1;
m ++;
break;
}
else
p = m + 1;
}
else
if(a[m] > k)
{
if(a[m - 1] < k)
{
ok = 1;
break;
}
else
q = m - 1;
}
else
{
if(a[m - 1] == k)
q = m - 1;
else
{
ok = 1;
break;
}
}
}
if(ok == 1)
{
g << m << "\n";
}
else
g << -1 << "\n";
}
}
}
return 0;
}