Advertisement
IanisBelu

D. Closest Equals

Jan 16th, 2024
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | Source Code | 0 0
  1. #ifdef LOCAL
  2. #include <iostream>
  3. #include <fstream>
  4. #include <iomanip>
  5. #include <random>
  6. #include <vector>
  7. #include <queue>
  8. #include <stack>
  9. #include <set>
  10. #include <map>
  11. #else
  12. #pragma GCC optimize("Ofast,unroll-loops")
  13. #include <bits/stdc++.h>
  14. #define cerr if (false) cerr
  15. #define endl '\n'
  16. #endif
  17.  
  18. #define fi first
  19. #define se second
  20.  
  21. #define sz(a) ((int)(a).size())
  22. #define all(a) (a).begin(), (a).end()
  23.  
  24. #define lsb(x) (x & (-x))
  25.  
  26. #define bit(mask, i) (((mask) >> (i)) & 1)
  27. #define popcount(x) __builtin_popcount(x)
  28.  
  29. #define YES cout << "YES" << endl
  30. #define NO cout << "NO" << endl
  31.  
  32. using namespace std;
  33.  
  34. template <typename T>
  35. bool ckmax(T &a, T b) { return a < b ? a = b, true : false; }
  36. template <typename T>
  37. bool ckmin(T &a, T b) { return a > b ? a = b, true : false; }
  38.  
  39. using ll = long long;
  40. using pii = pair<int, int>;
  41.  
  42. const int NMAX = 5e5+5;
  43. const int NIL = -1;
  44.  
  45. struct Node {
  46.    int min;
  47.    int lchild, rchild;
  48. };
  49.  
  50. int szv;
  51. Node v[23 * NMAX];
  52.  
  53. void v_push_back(Node node) {
  54.    v[szv++] = node;
  55. }
  56.  
  57. struct SegTree {
  58.    int n;
  59.    vector<int> roots;
  60.  
  61.    SegTree(int _n): n(_n), roots({ build(1, _n) }) { }
  62.  
  63.    int build(int l, int r) {
  64.       if (l >= r) {
  65.          Node node = { NMAX, NIL, NIL };
  66.          v_push_back(node);
  67.          return szv - 1;
  68.       }
  69.  
  70.       int mid = (l + r) >> 1;
  71.  
  72.       Node node = { NMAX, build(l, mid), build(mid + 1, r) };
  73.  
  74.       v_push_back(node);
  75.       return szv - 1;
  76.    }
  77.  
  78.    void update_val(int k, int pos, int val) {
  79.       roots[k] = update_val(roots[k], 1, n, pos, val);
  80.    }
  81.  
  82.    int update_val(int u, int l, int r, int pos, int val) {
  83.       if (pos < l || r < pos) return u;
  84.  
  85.       if (l >= r) {
  86.          v_push_back({ val, NIL, NIL });
  87.          return szv - 1;
  88.       }
  89.  
  90.       int mid = (l + r) >> 1;
  91.      
  92.       Node node = { 0,
  93.          update_val(v[u].lchild, l, mid, pos, val),
  94.          update_val(v[u].rchild, mid + 1, r, pos, val)
  95.       };
  96.  
  97.       node.min = min(v[node.lchild].min, v[node.rchild].min);
  98.  
  99.       v_push_back(node);
  100.       return szv - 1;
  101.    }
  102.  
  103.    int query_min(int k, int l, int r) {
  104.       int ret = query_min(roots[k], 1, n, l, r);
  105.       return ret == NMAX ? -1 : ret;
  106.    }
  107.  
  108.    int query_min(int u, int l, int r, int ll, int rr) {
  109.       if (ll <= l && r <= rr) return v[u].min;
  110.  
  111.       int mid = (l + r) >> 1;
  112.       int ret = NMAX;
  113.  
  114.       if (ll <= mid) ret = query_min(v[u].lchild, l, mid, ll, rr);
  115.       if (mid < rr) ret = min(ret, query_min(v[u].rchild, mid + 1, r, ll, rr));
  116.  
  117.       return ret;
  118.    }
  119.  
  120.    void update_copy(int k) {
  121.       v_push_back(v[roots[k]]);
  122.       roots.push_back(szv - 1);
  123.    }
  124. };
  125.  
  126. int n, m;
  127. int a[NMAX];
  128. vector<int> intervals[NMAX];
  129.  
  130. void read() {
  131.    cin >> n >> m;
  132.    for (int i = 1; i <= n; i++)
  133.       cin >> a[i];
  134. }
  135.  
  136. void solve() {
  137.    map<int, int> last_pos;
  138.  
  139.    for (int i = 1; i <= n; i++) {
  140.       if (last_pos[a[i]] != 0)
  141.          intervals[i].push_back(last_pos[a[i]]);
  142.       last_pos[a[i]] = i;
  143.    }
  144.    last_pos.clear();
  145.  
  146.    SegTree tree = SegTree(n);
  147.    for (int r = 1; r <= n; r++) {
  148.       tree.update_copy(r - 1);
  149.       for (auto &l : intervals[r])
  150.          tree.update_val(r, l, r - l);
  151.    }
  152.  
  153.    while (m--) {
  154.       int l, r;
  155.       cin >> l >> r;
  156.       cout << tree.query_min(r, l, r) << endl;
  157.    }
  158. }
  159.  
  160. signed main() {
  161. #ifdef LOCAL
  162.    freopen("input.txt", "r", stdin);
  163. #endif
  164.    ios_base::sync_with_stdio(false);
  165.    cin.tie(0);
  166.    cout.tie(0);
  167.  
  168.    read();
  169.    solve();
  170.  
  171.    return 0;
  172. }
  173.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement