Advertisement
Guest User

one occ

a guest
Apr 24th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define all(a) a.begin(), a.end()
  4. #define sz(a) (int)a.size()
  5. #define x first
  6. #define y second
  7. #define debug(...) cout << "[" << #__VA_ARGS__ << ": " << __VA_ARGS__ << "]\n"
  8. #define rd() abs((int)rng())
  9. using namespace std;
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<int, int>pii;
  13. const int maxn = 5e5 + 100;
  14. const int mod = 1e9 + 7;
  15. mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
  16. int n, q, arr[maxn], occ[maxn];
  17. int root[maxn], L[maxn * 80], R[maxn * 80], next_id = 1;
  18. pii seg[maxn * 80];
  19. void build(int id = 1, int l = 1, int r = n)
  20. {
  21.     if(l == r)
  22.     {
  23.         seg[id] = {mod, l};
  24.         return;
  25.     }
  26.     int mid = (l + r) / 2;
  27.     L[id] = ++next_id;
  28.     R[id] = ++next_id;
  29.     build(L[id], l, mid);
  30.     build(R[id], mid + 1, r);
  31.     seg[id] = min(seg[L[id]], seg[R[id]]);
  32. }
  33. int modify(int pos, int val, int id, int l = 1, int r = n)
  34. {
  35.     int new_id = ++next_id;
  36.     if(l == r)
  37.     {
  38.         seg[new_id] = {val, l};
  39.         return new_id;
  40.     }
  41.     int mid = (l + r) / 2;
  42.     L[new_id] = L[id];
  43.     R[new_id] = R[id];
  44.     if(pos <= mid)
  45.         L[new_id] = modify(pos, val, L[new_id], l, mid);
  46.     else
  47.         R[new_id] = modify(pos, val, R[new_id], mid + 1, r);
  48.     seg[new_id] = min(seg[L[new_id]], seg[R[new_id]]);
  49.     return new_id;
  50. }
  51. pii get(int x, int y, int id, int l = 1, int r = n)
  52. {
  53.     if(l > y || r < x) return {mod, mod};
  54.     if(l >= x && r <= y) return seg[id];
  55.     int mid = (l + r) / 2;
  56.     return min(get(x, y, L[id], l, mid), get(x, y, R[id], mid + 1, r));
  57. }
  58. int main()
  59. {
  60.     ios_base::sync_with_stdio(false), cin.tie(0);
  61.     cin >> n;
  62.     for(int i = 1; i <= n; i++)
  63.         cin >> arr[i];
  64.     build();
  65.     int prev_root = 1;
  66.     for(int i = 1; i <= n; i++)
  67.     {
  68.         if(occ[arr[i]] != 0)
  69.             prev_root = modify(occ[arr[i]], mod, prev_root);
  70.         prev_root = modify(i, occ[arr[i]], prev_root);
  71.         root[i] = prev_root;
  72.         occ[arr[i]] = i;
  73.     }
  74.     cin >> q;
  75.     while(q--)
  76.     {
  77.         int l, r;
  78.         cin >> l >> r;
  79.         pii p = get(l, r, root[r]);
  80.         if(p.x < l)
  81.             cout << arr[p.y] << "\n";
  82.         else
  83.             cout << "0\n";
  84.     }
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement