Pagini recente » Istoria paginii runda/abcde | Cod sursa (job #1777415) | Cod sursa (job #1797739) | Cod sursa (job #1830731) | Cod sursa (job #1881006)
#include<bits/stdc++.h>
using namespace std;
FILE *in = fopen("cautbin.in", "r");
FILE *out = fopen("cautbin.out", "w");
const int nmax = 1e5 + 5;
int n, m, a[nmax];
inline int first(int el)
{
int left = 1, right = n, mij;
bool gasit = false;
while(left <= right && !gasit)
{
mij = (left + right)/2;
if(a[mij] == el)
gasit = true;
else
{
if(a[mij] > el)
right = mij - 1;
else left = mij + 1;
}
}
if(!gasit)
return -1;
while(a[mij] == el && mij <= n)
++mij;
return mij-1;
}
inline int second(int y)
{
int left = 1, right = n, mij;
while(left < right)
{
mij = (left + right) / 2;
if( a[mij] <= y )
left = mij + 1;
else
right = mij;
}
mij = ( right + left ) / 2;
while(a[mij] > y) --mij;
return mij;
}
inline int third(int y)
{
int left, right, mij;
left = 1; right = n;
while(left < right)
{
int mij = ( left + right ) / 2;
if(a[mij] < y)
left = mij + 1;
else right = mij;
}
mij = (right + left) / 2;
while(a[mij] < y) ++ mij;
return mij;
}
void read()
{
int operation = 0;
fscanf(in, "%d", &n);
for(int i = 1; i <= n; i++)
fscanf(in, "%d", &a[i]);
fscanf(in, "%d", &m);
for(int i = 1; i <= m; i++)
{
int y;
fscanf(in, "%d%d", &operation, &y);
if(operation == 0)
{
fprintf(out, "%d\n", first(y));
}
else if( operation == 1 )
{
fprintf(out, "%d\n", second(y));
}
else if( operation == 2 )
{
fprintf(out, "%d\n", third(y));
}
}
}
int main()
{
read();
return 0;
}