Cod sursa(job #2634515)

Utilizator lucametehauDart Monkey lucametehau Data 11 iulie 2020 12:13:47
Problema Pq Scor 100
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 1.46 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream cin ("pq.in");
ofstream cout ("pq.out");

struct Query {
  int l, r, ind;
  bool operator < (const Query &other) const {
    return r < other.r;
  }
};

int n, m;

int v[100005], ans[100005], lst[100005];
Query q[100005];
int aint[400005];

void update(int nod, int st, int dr, int ind, int val) {
  if(st > dr || ind < st || dr < ind)
    return;
  if(st == dr) {
    aint[nod] = val;
    return;
  }
  int mid = (st + dr) >> 1;
  update((nod << 1), st, mid, ind, val);
  update((nod << 1) | 1, mid + 1, dr, ind, val);
  aint[nod] = max(aint[(nod << 1)], aint[(nod << 1) | 1]);
}

int query(int nod, int st, int dr, int l, int r) {
  if(st > dr || r < st || dr < l)
    return 0;
  if(l <= st && dr <= r)
    return aint[nod];
  int mid = (st + dr) >> 1;
  return max(query((nod << 1), st, mid, l, r), query((nod << 1) | 1, mid + 1, dr, l, r));
}

int main() {
  cin >> n >> m;
  for(int i = 1; i <= n; i++)
    cin >> v[i];
  for(int i = 1; i <= m; i++)
    cin >> q[i].l >> q[i].r, q[i].ind = i;
  sort(q + 1, q + m + 1);
  int j = 1;
  for(int i = 1; i <= n; i++) {
    if(lst[v[i]])
      update(1, 1, n, lst[v[i]], i - lst[v[i]]);
    lst[v[i]] = i;
    while(j <= m && q[j].r == i) {
      ans[q[j].ind] = query(1, 1, n, q[j].l, q[j].r);
      j++;
    }
  }
  for(int i = 1; i <= m; i++)
    cout << (ans[i] == 0 ? -1 : ans[i]) << "\n";
  return 0;
}