Cod sursa(job #2242512)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 18 septembrie 2018 20:20:29
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100000;
const int QMAX = 100000;
const int VMAX = 99999;

int l[VMAX + 5];
int a[NMAX + 5];
int sol[QMAX + 5];
int v[NMAX + 5];

struct Q {
  int l, r, i;
  bool operator < (const Q& other) const {
    return l < other.l;
  }
}q[QMAX + 5];

void u(int p, int n, int s) {
  for (; p <= n; p += (p & -p))
    v[p] = max(v[p], s);
}

int y(int p) {
  int x = 0;
  for (; p; p -= (p & -p))
    x = max(x, v[p]);
  return x;
}

int main() {
  freopen("pq.in", "r", stdin);
  freopen("pq.out", "w", stdout);

  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; ++i)
    scanf("%d", &a[i]);
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &q[i].l, &q[i].r);
    q[i].i = i;
  }
  sort(q + 1, q + m + 1);
  int j = m;
  for (int i = n; i >= 1; --i) {
    if (l[a[i]] != 0)
      u(l[a[i]], n, l[a[i]] - i);
    l[a[i]] = i;
    while (j > 0 && q[j].l == i) {
      sol[q[j].i] = y(q[j].r);
      j--;
    }
  }

  for (int i = 1; i <= m; ++i)
    if (sol[i] == 0)
      printf("-1\n");
    else
      printf("%d\n", sol[i]);

  return 0;
}