Guest User

Solution for DQUERY - SPOJ with Persistent Segment Tree

a guest
Jun 12th, 2020
516
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using ll = long long;
  5.  
  6. const int N = 2e5 + 3;
  7. const int M = 1e6 + 7;
  8. const long long MOD = 1e9 + 7;
  9. const long long INF = 1e18 + 9;
  10. const int SM = 1e3 + 5;
  11. const int logN = 20, BL = 400;
  12. const double EPS = 3e-16;
  13.  
  14. struct Node {
  15.     long long lv = 0, rv = 0, sum = 0;
  16. }t[N * 22];
  17.  
  18. long long a[N], root[N], sz = 0, n, q, last[M];
  19.  
  20. long long build(long long tl, long long tr){
  21.     long long v = ++sz;
  22.     if(tl != tr){
  23.         long long tm = tl + tr >> 1;
  24.         t[v].lv = build(tl, tm);
  25.         t[v].rv = build(tm + 1, tr);
  26.     }
  27.     return v;
  28. }
  29.  
  30. long long update(long long v, long long tl, long long tr, long long pos, long long val){
  31.     long long nv = ++sz;
  32.     t[nv] = t[v], t[nv].sum += val;
  33.     if(tl == tr) return nv;
  34.     else {
  35.         long long tm = tl + tr >> 1;
  36.         if(pos <= tm) t[nv].lv = update(t[v].lv, tl, tm, pos, val);
  37.         else t[nv].rv = update(t[v].rv, tm + 1, tr, pos, val);
  38.     }
  39.     return nv;
  40. }
  41.  
  42. long long get(long long v, long long tl, long long tr, long long l, long long r){
  43.     if(tr < l || r < tl) return 0;
  44.     if(l <= tl && tr <= r) return t[v].sum;
  45.     long long tm = tl + tr >> 1;
  46.     return get(t[v].lv, tl, tm, l, r) + get(t[v].rv, tm + 1, tr, l, r);
  47. }
  48.  
  49. int main(){
  50. //  freopen(".in", "r", stdin);
  51. //  freopen(".out", "w", stdout);
  52.     ios_base::sync_with_stdio(false);
  53.     cin.tie(0), cout.tie(0);
  54.     long long n; cin >> n;
  55.  
  56.     root[0] = build(1, n);
  57.     for(long long i = 1; i <= n; i++){
  58.         long long x; cin >> x;
  59.         root[i] = root[i - 1];
  60.         if(last[x] > 0) root[i] = update(root[i], 1, n, last[x], -1);
  61.         last[x] = i;
  62.         root[i] = update(root[i], 1, n, i, 1);
  63.     }
  64.    
  65.     long long q; cin >> q;
  66.     while(q--){
  67.         long long l, r; cin >> l >> r;
  68.         cout << get(root[r], 1, n, l, r) << "\n";
  69.     }
  70.  
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment