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