Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #include <algorithm>
  5. #include <utility>
  6.  
  7. #define MAXN 100010
  8. #define MAXM 100010
  9.  
  10. struct query {
  11.   int first, second;
  12.   int idx;
  13. };
  14.  
  15. int A[MAXN];
  16. query Q[MAXM];
  17. int ans[MAXM];
  18.  
  19. int cnt[1000010];
  20. int N, M;
  21.  
  22. int main( )
  23. {
  24.   scanf("%d", &N);
  25.   for (int i = 0; i < N; i++) {
  26.     scanf("%d", &A[i]);
  27.   }
  28.  
  29.   scanf("%d", &M);
  30.   for (int i = 0; i < M; i++) {
  31.     scanf("%d %d", &Q[i].first, &Q[i].second);
  32.     Q[i].first--;
  33.     Q[i].second--;
  34.     Q[i].idx = i;
  35.   }
  36.  
  37.   std::sort(Q, Q + M, [&](const query a, const query b) {
  38.     const static int size = sqrt(N);
  39.     return (a.second / size == b.second / size) ?  (a.first < b.first) :
  40.       (a.second / size < b.second / size);
  41.   });
  42.  
  43.   int l = Q[0].first, r = Q[0].first - 1;
  44.   int count = 0;
  45.  
  46.   for (int i = 0; i < M; i++) {
  47.     if (l < Q[i].first) {
  48.       for (; l < Q[i].first; l++) {
  49.         cnt[A[l]]--;
  50.         if (cnt[A[l]] == 0) {
  51.           count--;
  52.         }
  53.       }
  54.     }
  55.     else if (l > Q[i].first) {
  56.       for (l = l - 1; l >= Q[i].first; l--) {
  57.         if (cnt[A[l]] == 0) {
  58.           count++;
  59.         }
  60.         cnt[A[r]]++;
  61.       }
  62.     }
  63.  
  64.     if (r < Q[i].second) {
  65.       for (r = r + 1; r <= Q[i].second; r++) {
  66.         if (cnt[A[r]] == 0) {
  67.           count++;
  68.         }
  69.         cnt[A[r]]++;
  70.       }
  71.     }
  72.     else if (r > Q[i].second) {
  73.       for (; r >= Q[i].second + 1; r--) {
  74.         cnt[A[r]]--;
  75.         if (cnt[A[r]] == 0) {
  76.           count--;
  77.         }
  78.       }
  79.     }
  80.  
  81.     l = Q[i].first;
  82.     r = Q[i].second;
  83.  
  84.     ans[Q[i].idx] = count;
  85.   }
  86.  
  87.   for (int i = 0; i < M; i++) {
  88.     printf("%d\n", ans[i]);
  89.   }
  90.  
  91.   return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement