Cod sursa(job #1567533)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 13 ianuarie 2016 14:39:21
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <algorithm>

#define MaxN 100000
#define BUCKET 320

using namespace std;

int v[MaxN];
int s[BUCKET];

int main() {
   freopen("cautbin.in", "r", stdin);
   freopen("cautbin.out", "w", stdout);
   int N, Q, queryType, key;
   int numBuckets;
   int poz;

   scanf("%d", &N);
   for (int i = 0; i < N; i++) {
      scanf("%d", &v[i]);
   }

   s[0] = -1;
   numBuckets = 1;
   for (int i = BUCKET - 1; i < N; i += BUCKET) {
      s[numBuckets++] = v[i];
   }

   scanf("%d", &Q);
   for (int iter = 0; iter < Q; iter++) {
      scanf("%d%d", &queryType, &key);

      key -= (queryType == 2);

      poz = upper_bound(s, s + numBuckets, key) - s - 1;
      poz *= BUCKET;
      poz = upper_bound(v + poz, v + min(poz + BUCKET, N), key) - v - 1;

      if (!queryType) {
         if (v[poz] == key) {
            printf("%d\n", poz + 1);
         } else {
            puts("-1");
         }
      } else {
         poz += (queryType == 2);
         printf("%d\n", poz + 1);
      }
   }
   fclose(stdin);
   fclose(stdout);
   return 0;
}