Advertisement
IanisBelu

fsecv

Nov 23rd, 2023
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. #ifdef LOCAL
  8. ifstream fin("input.txt");
  9. #define fout cout
  10. #else
  11. ifstream fin("fsecv.in");
  12. ofstream fout("fsecv.out");
  13. #include <bits/stdc++.h>
  14. #define endl '\n'
  15. #endif
  16.  
  17. const int NMAX  = 1e5+2;
  18.  
  19. struct Query {
  20.     int l, r, k, idx;
  21. };
  22.  
  23. int n, q;
  24. int a[NMAX];
  25. int *p[NMAX];
  26. int bucket[NMAX];
  27. int sq;
  28. Query qs[NMAX];
  29. int ap[NMAX];
  30. int ans[NMAX];
  31. int cnt[NMAX];
  32.  
  33. bool cmp(const int *a, const int *b) {
  34.     return *a < *b;
  35. }
  36.  
  37. bool cmp2(const Query &a, const Query &b) {
  38.     if (bucket[a.l] == bucket[b.l]) return a.r < b.r;
  39.     return a.l < b.l;
  40. }
  41.  
  42. void read() {
  43.     fin >> n >> q;
  44.     for (int i = 1; i <= n; i++) {
  45.         fin >> a[i];
  46.     }
  47.     for (int i = 1; i <= q; i++) {
  48.         fin >> qs[i].l >> qs[i].r >> qs[i].k;
  49.     }
  50. }
  51.  
  52. void precalc() {
  53.     sq = sqrt(n);
  54.     for (int i = 1; i <= n; i++)
  55.         bucket[i] = (i - 1) / sq + 1;
  56.  
  57.     for (int i = 1; i <= n; i++)
  58.         p[i] = &a[i];
  59.     sort(p + 1, p + n + 1, cmp);
  60.  
  61.     int val = 0;
  62.     for (int i = 1; i <= n; i++) {
  63.         int v = *p[i];
  64.         *p[i] = val;
  65.         if (i != n && v != *p[i + 1]) val++;
  66.     }
  67.  
  68.     for (int i = 1; i <= q; i++)
  69.         qs[i].idx = i;
  70.     sort(qs + 1, qs + q + 1, cmp2);
  71. }
  72.  
  73. void solve() {
  74.     int l = 1, r = 1;
  75.     ap[a[1]] = 1;
  76.     cnt[1] = 1;
  77.     for (int i = 1; i <= q; i++) {
  78.         while (l < qs[i].l) {
  79.             cnt[ap[a[l]]]--;
  80.             cnt[ap[a[l]] - 1]++;
  81.             ap[a[l++]]--;
  82.         }
  83.         while (qs[i].r < r) {
  84.             cnt[ap[a[r]]]--;
  85.             cnt[ap[a[r]] - 1]++;
  86.             ap[a[r--]]--;
  87.         }
  88.         while (qs[i].l < l) {
  89.             cnt[ap[a[l - 1]]]--;
  90.             ap[a[--l]]++;
  91.             cnt[ap[a[l]]]++;
  92.         }
  93.         while (r < qs[i].r) {
  94.             cnt[ap[a[r + 1]]]--;
  95.             ap[a[++r]]++;
  96.             cnt[ap[a[r]]]++;
  97.         }
  98.         ans[qs[i].idx] = cnt[qs[i].k];
  99.     }
  100.     for (int i = 1; i <= q; i++)
  101.         fout << ans[i] << endl;
  102. }
  103.  
  104. int main() {
  105.     read();
  106.     precalc();
  107.     solve();
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement