Advertisement
MathQ_

Untitled

Aug 6th, 2021
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.24 KB | None | 0 0
  1. const int k = 500;
  2. struct query { int l, r, i; };
  3.  
  4. istream& operator>>(istream &in, query &q) {
  5.     in >> q.l >> q.r;
  6.     return in;
  7. }
  8.  
  9. bool cmp(query &q1, query &q2) {
  10.     if (q1.l / k == q2.l / k) {
  11.         return q1.r < q2.r;
  12.     }
  13.     return q1.l < q2.l;
  14. }
  15.  
  16. int main() {
  17.     fast
  18.     // file_in
  19.     // file_in_out
  20.  
  21.     int n, m;
  22.     cin >> n;
  23.     vector<int> a(n);
  24.     cin >> a >> m;
  25.  
  26.     vector<int> b = a;
  27.     sort(all(b));
  28.     gp_hash_table<int, int> get;
  29.     for (int i = 0; i < n; ++i) if (!get[b[i]]) get[b[i]] = i + 1;
  30.  
  31.     vector<query> qq(m);
  32.     cin >> qq;
  33.     for (int i = 0; i < m; ++i) {
  34.         qq[i].l--; qq[i].r--; qq[i].i = i;
  35.     }
  36.     sort(all(qq), cmp);
  37.  
  38.     vector<int> ans(m);
  39.     int ht[n + 1];
  40.     int l, r, cnt, c = -1;
  41.     for (auto q : qq) {
  42.         if (q.l / k != c) {
  43.             for (int i = 0; i <= n; ++i) ht[i] = 0;
  44.             l = q.l; r = q.r; cnt = 0;
  45.             for (int i = l; i <= r; ++i) {
  46.                 if (!ht[get[a[i]]]) ++cnt;
  47.                 ht[get[a[i]]]++;
  48.             }
  49.         }
  50.        
  51.         while (r < q.r) {
  52.             ++r;
  53.             if (!ht[get[a[r]]]) ++cnt;
  54.             ht[get[a[r]]]++;
  55.         }
  56.         while (l < q.l) {
  57.             ht[get[a[l]]]--;
  58.             if (!ht[get[a[l]]]) --cnt;
  59.             ++l;
  60.         }
  61.         while (l > q.l) {
  62.             --l;
  63.             if (!ht[get[a[l]]]) ++cnt;
  64.             ht[get[a[l]]]++;
  65.         }
  66.         ans[q.i] = cnt;
  67.     }
  68.     for (auto el : ans) cout << el << '\n';
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement