Pagini recente » Cod sursa (job #637750) | Cod sursa (job #2292441) | Cod sursa (job #1301284) | Cod sursa (job #1834820) | Cod sursa (job #1232111)
#include <stdio.h>
#define FIN "cautbin.in"
#define FOUT "cautbin.out"
#define MAXN 100001
int n,
vec[ MAXN ],
num_questions;
int request0(int li, int ls, int what) {
int pos = -1, found = 0;
int middle;
while( li <= ls && !found ) {
middle = (li + ls) >> 1;
if( vec[ middle ] > what) {
ls = middle - 1;
} else if(vec[ middle ] < what) {
li = middle + 1;
} else {
pos = middle;
found = 1;
while(vec[ pos + 1 ] == what) {
pos++;
}
}
}
return pos;
};
int request1(int li, int ls, int what) {
int middle;
while(li <= ls ) {
if(li == ls) {
return li;
}
middle = (li + ls) >> 1;
if(what >= vec[middle]) {
li = middle;
}
if(what < vec[ middle ]) {
ls = middle;
}
if(ls - li == 1) {
if(vec[ ls ] <= what)
return ls;
else return li;
}
}
};
int request2(int li, int ls, int what) {
int pos = -1, found = 0;
int middle;
while( li <= ls && !found ) {
middle = (li + ls) >> 1;
if( vec[ middle ] > what) {
ls = middle - 1;
} else if(vec[ middle ] < what) {
li = middle + 1;
} else {
pos = middle;
found = 1;
while( vec[ pos - 1 ] == what ) {
pos--;
}
}
}
return pos;
};
void readAndSolve() {
int i, op, j;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d", &n);
for(i = 1; i <= n; i++) scanf("%d", &vec[ i ]);
scanf("%d", &num_questions);
for(; num_questions; num_questions--) {
scanf("%d %d", &op, &j);
switch( op ) {
case 0:
printf("%d\n", request0(1,n,j));
break;
case 1:
printf("%d\n", request1(1,n,j));
break;
case 2:
printf("%d\n", request2(1,n,j));
break;
}
}
fclose( stdin );
fclose( stdout );
};
int main() {
readAndSolve();
return(0);
}