Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <bits/stdc++.h>
- using namespace std;
- #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
- template <typename... Args> void logger(string vars, Args &&... values)
- {
- cerr << vars << " = ";
- string delim = "";
- (..., (cerr << delim << values, delim = ", "));
- cerr << endl;
- }
- namespace atcoder
- {
- template <class S, S (*op)(S, S), S (*e)()> struct segtree {
- int ceil_pow2(int n)
- {
- int x = 0;
- while ((1U << x) < (unsigned int) (n))
- x++;
- return x;
- }
- public:
- segtree() : segtree(0) {}
- explicit segtree(int n) : segtree(std::vector<S>(n, e())) {}
- explicit segtree(const std::vector<S> &v) : _n(int(v.size()))
- {
- log = ceil_pow2(_n);
- size = 1 << log;
- d = std::vector<S>(2 * size, e());
- for (int i = 0; i < _n; i++)
- d[size + i] = v[i];
- for (int i = size - 1; i >= 1; i--) {
- update(i);
- }
- }
- void set(int p, S x)
- {
- assert(0 <= p && p < _n);
- p += size;
- d[p] = x;
- for (int i = 1; i <= log; i++)
- update(p >> i);
- }
- S get(int p) const
- {
- assert(0 <= p && p < _n);
- return d[p + size];
- }
- S prod(int l, int r) const
- {
- assert(0 <= l && l <= r && r <= _n);
- S sml = e(), smr = e();
- l += size;
- r += size;
- while (l < r) {
- if (l & 1)
- sml = op(sml, d[l++]);
- if (r & 1)
- smr = op(d[--r], smr);
- l >>= 1;
- r >>= 1;
- }
- return op(sml, smr);
- }
- S all_prod() const { return d[1]; }
- template <bool (*f)(S)> int max_right(int l) const
- {
- return max_right(l, [](S x) { return f(x); });
- }
- template <class F> int max_right(int l, F f) const
- {
- assert(0 <= l && l <= _n);
- assert(f(e()));
- if (l == _n)
- return _n;
- l += size;
- S sm = e();
- do {
- while (l % 2 == 0)
- l >>= 1;
- if (!f(op(sm, d[l]))) {
- while (l < size) {
- l = (2 * l);
- if (f(op(sm, d[l]))) {
- sm = op(sm, d[l]);
- l++;
- }
- }
- return l - size;
- }
- sm = op(sm, d[l]);
- l++;
- } while ((l & -l) != l);
- return _n;
- }
- template <bool (*f)(S)> int min_left(int r) const
- {
- return min_left(r, [](S x) { return f(x); });
- }
- template <class F> int min_left(int r, F f) const
- {
- assert(0 <= r && r <= _n);
- assert(f(e()));
- if (r == 0)
- return 0;
- r += size;
- S sm = e();
- do {
- r--;
- while (r > 1 && (r % 2))
- r >>= 1;
- if (!f(op(d[r], sm))) {
- while (r < size) {
- r = (2 * r + 1);
- if (f(op(d[r], sm))) {
- sm = op(d[r], sm);
- r--;
- }
- }
- return r + 1 - size;
- }
- sm = op(d[r], sm);
- } while ((r & -r) != r);
- return 0;
- }
- private:
- int _n, size, log;
- std::vector<S> d;
- void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
- };
- } // namespace atcoder
- using atcoder::segtree;
- using S = int;
- /*
- struct S {
- int min_len;
- };
- */
- S op(S a, S b) { return min(a, b); }
- S e() { return int(1e9); }
- template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
- using ll = long long;
- using pii = pair<int, int>;
- using piii = pair<pii, int>;
- int n, m;
- pii arr[500003];
- pii seg[500003];
- piii q[500003];
- int main(int argc, char **argv)
- {
- scanf("%d%d", &n, &m);
- for (int i = 1; i <= n; ++i)
- scanf("%d", &arr[i].first), arr[i].second = i;
- sort(arr + 1, arr + 1 + n);
- int scnt = 0;
- for (int i = 1; i < n; ++i)
- if (arr[i].first == arr[i + 1].first)
- seg[scnt].first = arr[i + 1].second, seg[scnt].second = arr[i].second, scnt += 1;
- sort(seg, seg + scnt);
- for (int i = 1; i <= m; ++i) {
- scanf("%d%d", &q[i].first.second, &q[i].first.first);
- q[i].second = i;
- }
- sort(q + 1, q + 1 + m);
- segtree<S, op, e> st(500003);
- vector<int> ans(m + 1);
- for (int i = 1, sid = 0; i <= m; ++i) {
- while (sid < scnt && seg[sid].first <= q[i].first.first) {
- int l = seg[sid].second;
- int len = seg[sid].first - seg[sid].second;
- st.set(l, len);
- ++sid;
- }
- int res = st.prod(q[i].first.second, q[i].first.first + 1);
- ans[q[i].second] = (res == e() ? -1 : res);
- }
- for (int i = 1; i < ans.size(); ++i)
- printf("%d\n", ans[i]);
- return 0;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement