Advertisement
wojiaocbj

Untitled

Apr 3rd, 2023 (edited)
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.00 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <ctype.h>
  6. #include <time.h>
  7. #pragma warning(disable:4996 6031)
  8. void *lowerbound(void *key, void *base, size_t count, size_t itemsize, int(*compare)(const void *, const void *)){
  9.     size_t lo = 0, hi = count - 1, mid = 0;
  10.     if(compare(key, (char *)base + hi * itemsize) > 0){
  11.         return (char *)base + count * itemsize;
  12.     }
  13.     char *pmid = 0;
  14.     while(lo < hi){
  15.         mid = (lo + hi) >> 1;
  16.         pmid = ((char *)base) + mid * itemsize;
  17.         if(compare(pmid, key) < 0){
  18.             lo = mid + 1;
  19.         }
  20.         else{
  21.             hi = mid;
  22.         }
  23.     }
  24.     return (char *)base + lo * itemsize;
  25. }
  26. void *upperbound(void *key, void *base, size_t count, size_t itemsize, int(*compare)(const void *, const void *)){
  27.     size_t lo = 0, hi = count - 1, mid;
  28.     if(compare(key, (char *)base + hi * itemsize) >= 0){
  29.         return (char *)base + count * itemsize;
  30.     }
  31.     char *pmid = 0;
  32.     while(lo < hi){
  33.         mid = (lo + hi) >> 1;
  34.         char *pmid = ((char *)base) + mid * itemsize;
  35.         if(compare(pmid, key) <= 0){
  36.             lo = mid + 1;
  37.         }
  38.         else{
  39.             hi = mid;
  40.         }
  41.     }
  42.     return (char *)base + lo * itemsize;
  43. }
  44. int arr[1919810] = { 0 };
  45. int compare_s32(const void *p, const void *q){
  46.     int x = *((int *)p), y = *((int *)q);
  47.     if(x < y){
  48.         return -1;
  49.     }
  50.     else if(x > y){
  51.         return 1;
  52.     }
  53.     else{
  54.         return 0;
  55.     }
  56. }
  57. int main(){
  58.     int n, t, i, k, *lb, *ub;
  59.     scanf("%d%d", &n, &t);
  60.     for(i = 0; i < n; i++){
  61.         scanf("%d", arr + i);
  62.     }
  63.     while(t--){
  64.         scanf("%d", &k);
  65.         lb = lowerbound(&k, arr, n, sizeof(int), compare_s32);
  66.         ub = upperbound(&k, arr, n, sizeof(int), compare_s32);
  67.         if(*lb == k && (lb < arr + n)){
  68.             printf("%d %d\n", lb - arr + 1, ub - lb);
  69.         }
  70.         else{
  71.             puts("-1");
  72.         }
  73.     }
  74.     return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement