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