Pagini recente » Cod sursa (job #3216436) | Cod sursa (job #2852924) | Cod sursa (job #2860742) | Cod sursa (job #2059031) | Cod sursa (job #673537)
Cod sursa(job #673537)
#include <stdio.h>
int a[100001];
int max_pos(int value, int i1, int i2)
{
if (i1 == i2)
return (a[i1] == value) ? i1 : -1;
int m = i1 + (i2 - i1) / 2;
if (value >= a[m + 1])
return max_pos(value, m + 1, i2);
return max_pos(value, i1, m);
}
int max_pos_min_value(int value, int i1, int i2)
{
if (i1 == i2)
return (a[i1] == value) ? i1 : -1;
int m = i1 + (i2 - i1) / 2;
if (a[m] < value && value < a[m + 1])
return m;
if (value >= a[m + 1]) {
int max = max_pos_min_value(value, m + 1, i2);
return (max == -1) ? (m + 1) : max;
}
return max_pos_min_value(value, i1, m);
}
int min_pos_max_value(int value, int i1, int i2)
{
if (i1 == i2)
return (a[i1] == value) ? i1 : -1;
int m = i1 + (i2 - i1) / 2;
if (a[m] < value && value < a[m + 1])
return m + 1;
if (a[m] >= value)
return min_pos_max_value(value, i1, m);
return min_pos_max_value(value, m + 1, i2);
}
int main()
{
int n, m;
freopen("cautbin.in", "r", stdin);
freopen("cautbin.out", "w", stdout);
scanf("%d\n", &n);
for (int i = 0; i < n; i++)
scanf("%d ", &a[i]);
scanf("%d\n", &m);
for (int i = 0; i < m; i++) {
int code, x, result;
scanf("%d %d\n", &code, &x);
switch (code) {
case 0:
result = max_pos(x, 0, n - 1);
printf("%d\n", (result == -1) ? -1 : (result + 1));
break;
case 1:
printf("%d\n", 1 + max_pos_min_value(x, 0, n - 1));
break;
case 2:
printf("%d\n", 1 + min_pos_max_value(x, 0, n - 1));
break;
}
}
return 0;
}