Advertisement
pb_jiang

cf522d WA

Sep 23rd, 2022
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.95 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  5. template <typename... Args> void logger(string vars, Args &&...values)
  6. {
  7.     cerr << vars << " = ";
  8.     string delim = "";
  9.     (..., (cerr << delim << values, delim = ", "));
  10.     cerr << endl;
  11. }
  12.  
  13. namespace atcoder
  14. {
  15.  
  16. template <class S, S (*op)(S, S), S (*e)()> struct segtree {
  17.     int ceil_pow2(int n)
  18.     {
  19.         int x = 0;
  20.         while ((1U << x) < (unsigned int) (n))
  21.             x++;
  22.         return x;
  23.     }
  24.  
  25.   public:
  26.     segtree() : segtree(0) {}
  27.     explicit segtree(int n) : segtree(std::vector<S>(n, e())) {}
  28.     explicit segtree(const std::vector<S> &v) : _n(int(v.size()))
  29.     {
  30.         log = ceil_pow2(_n);
  31.         size = 1 << log;
  32.         d = std::vector<S>(2 * size, e());
  33.         for (int i = 0; i < _n; i++)
  34.             d[size + i] = v[i];
  35.         for (int i = size - 1; i >= 1; i--) {
  36.             update(i);
  37.         }
  38.     }
  39.  
  40.     void set(int p, S x)
  41.     {
  42.         assert(0 <= p && p < _n);
  43.         p += size;
  44.         d[p] = x;
  45.         for (int i = 1; i <= log; i++)
  46.             update(p >> i);
  47.     }
  48.  
  49.     S get(int p) const
  50.     {
  51.         assert(0 <= p && p < _n);
  52.         return d[p + size];
  53.     }
  54.  
  55.     S prod(int l, int r) const
  56.     {
  57.         assert(0 <= l && l <= r && r <= _n);
  58.         S sml = e(), smr = e();
  59.         l += size;
  60.         r += size;
  61.  
  62.         while (l < r) {
  63.             if (l & 1)
  64.                 sml = op(sml, d[l++]);
  65.             if (r & 1)
  66.                 smr = op(d[--r], smr);
  67.             l >>= 1;
  68.             r >>= 1;
  69.         }
  70.         return op(sml, smr);
  71.     }
  72.  
  73.     S all_prod() const { return d[1]; }
  74.  
  75.     template <bool (*f)(S)> int max_right(int l) const
  76.     {
  77.         return max_right(l, [](S x) { return f(x); });
  78.     }
  79.     template <class F> int max_right(int l, F f) const
  80.     {
  81.         assert(0 <= l && l <= _n);
  82.         assert(f(e()));
  83.         if (l == _n)
  84.             return _n;
  85.         l += size;
  86.         S sm = e();
  87.         do {
  88.             while (l % 2 == 0)
  89.                 l >>= 1;
  90.             if (!f(op(sm, d[l]))) {
  91.                 while (l < size) {
  92.                     l = (2 * l);
  93.                     if (f(op(sm, d[l]))) {
  94.                         sm = op(sm, d[l]);
  95.                         l++;
  96.                     }
  97.                 }
  98.                 return l - size;
  99.             }
  100.             sm = op(sm, d[l]);
  101.             l++;
  102.         } while ((l & -l) != l);
  103.         return _n;
  104.     }
  105.  
  106.     template <bool (*f)(S)> int min_left(int r) const
  107.     {
  108.         return min_left(r, [](S x) { return f(x); });
  109.     }
  110.     template <class F> int min_left(int r, F f) const
  111.     {
  112.         assert(0 <= r && r <= _n);
  113.         assert(f(e()));
  114.         if (r == 0)
  115.             return 0;
  116.         r += size;
  117.         S sm = e();
  118.         do {
  119.             r--;
  120.             while (r > 1 && (r % 2))
  121.                 r >>= 1;
  122.             if (!f(op(d[r], sm))) {
  123.                 while (r < size) {
  124.                     r = (2 * r + 1);
  125.                     if (f(op(d[r], sm))) {
  126.                         sm = op(d[r], sm);
  127.                         r--;
  128.                     }
  129.                 }
  130.                 return r + 1 - size;
  131.             }
  132.             sm = op(d[r], sm);
  133.         } while ((r & -r) != r);
  134.         return 0;
  135.     }
  136.  
  137.   private:
  138.     int _n, size, log;
  139.     std::vector<S> d;
  140.  
  141.     void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
  142. };
  143.  
  144. } // namespace atcoder
  145. using atcoder::segtree;
  146.  
  147. using S = int;
  148. /*
  149. struct S {
  150.   int min_len;
  151. };
  152. */
  153. S op(S a, S b) { return min(a, b); }
  154. S e() { return int(1e9); }
  155.  
  156. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  157. using ll = long long;
  158. using pii = pair<int, int>;
  159. using piii = pair<pii, int>;
  160.  
  161. int n, m;
  162. pii arr[500003];
  163. pii seg[500003];
  164. piii q[500003];
  165.  
  166. int main(int argc, char **argv)
  167. {
  168.     scanf("%d%d", &n, &m);
  169.     for (int i = 1; i <= n; ++i)
  170.         scanf("%d", &arr[i].first), arr[i].second = i;
  171.     sort(arr + 1, arr + 1 + n);
  172.  
  173.     int scnt = 0;
  174.     for (int i = 1; i <= n; ++i)
  175.         if (arr[i].first == arr[i + 1].first)
  176.             seg[scnt].first = arr[i + 1].second, seg[scnt].second = arr[i].second, scnt += 1;
  177.     sort(seg, seg + scnt);
  178.  
  179.     for (int i = 1; i <= m; ++i) {
  180.         scanf("%d%d", &q[i].first.second, &q[i].first.first);
  181.         q[i].second = i;
  182.     }
  183.     sort(q + 1, q + 1 + m);
  184.     segtree<S, op, e> st(500003);
  185.     vector<int> ans(m + 1);
  186.     for (int i = 1, sid = 0; i <= m; ++i) {
  187.         while (seg[sid].first <= q[i].first.first) {
  188.             int l = seg[sid].second;
  189.             int len = seg[sid].first - seg[sid].second;
  190.             st.set(l, len);
  191.             ++sid;
  192.         }
  193.         int res = st.prod(q[i].first.second, q[i].first.first + 1);
  194.         ans[q[i].second] = (res == e() ? -1 : res);
  195.     }
  196.     for (int i = 1; i < ans.size(); ++i)
  197.         printf("%d\n", ans[i]);
  198.     return 0;
  199. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement