Josif_tepe

Untitled

Sep 6th, 2026
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <bits/stdc++.h>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <cstring>
  7. #include <map>
  8. using namespace std;
  9. typedef long long ll;
  10. const int maxn = 2e5 + 10;
  11. int a[maxn];
  12. int block_size;
  13. ll result;
  14. ll freq[maxn];
  15. struct query {
  16.     int L, R, idx,  b;
  17.     query() {}
  18.     query(int _L, int _R, int _idx, int _b) {
  19.         L = _L;
  20.         R = _R;
  21.         idx = _idx;
  22.         b = _b;
  23.     }
  24.    
  25.     bool operator < (const query & q) const {
  26.         if(b != q.b) {
  27.             return b < q.b;
  28.         }
  29.        
  30.         if(b % 2 == 1) {
  31.             return R < q.R;
  32.         }
  33.         return R > q.R;
  34.     }
  35. };
  36.  
  37. void add(int idx) {
  38.     ll f = freq[a[idx]];
  39.     result += f * (f - 1) / 2;
  40.     freq[a[idx]]++;
  41. }
  42.  
  43. void remove(int idx) {
  44.     freq[a[idx]]--;
  45.     ll f = freq[a[idx]];
  46.     result -= f * (f - 1) / 2;
  47.    
  48. }
  49. int main() {
  50.     ios_base::sync_with_stdio(false);
  51.     int n, q;
  52.     cin >> n >> q;
  53.    
  54.     for(int i = 1; i <= n; i++) {
  55.         cin >> a[i];
  56.     }
  57.    
  58.     block_size = max(1, int(n / sqrt(q)));
  59.    
  60.     vector<query> queries(q);
  61.     for(int i = 0; i < q; i++) {
  62.         cin >> queries[i].L >> queries[i].R;
  63.         queries[i].idx = i;
  64.         queries[i].b = queries[i].L / block_size;
  65.     }
  66.    
  67.     sort(queries.begin(), queries.end());
  68.     result = 0;
  69.    
  70.     int curr_L = 1, curr_R = 0;
  71.    
  72.     vector<ll> ans(q);
  73.     for(int i = 0; i < q; i++) {
  74.         int L = queries[i].L, R = queries[i].R;
  75.        
  76.         while(curr_L > L) {
  77.             curr_L--;
  78.             add(curr_L);
  79.         }
  80.         while(curr_R < R) {
  81.             curr_R++;
  82.             add(curr_R);
  83.         }
  84.        
  85.         while(curr_L < L) {
  86.             remove(curr_L);
  87.             curr_L++;
  88.         }
  89.         while(curr_R > R) {
  90.             remove(curr_R);
  91.             curr_R--;
  92.         }
  93.        
  94.         ans[queries[i].idx] = result;
  95.     }
  96.    
  97.     for(int i = 0; i < q; i++) {
  98.         cout << ans[i] << "\n";
  99.     }
  100.    
  101.    
  102.     return 0;
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment