Cod sursa(job #2242509)

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

using namespace std;

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

int last[VMAX + 5];
int a[NMAX + 5];
int sol[QMAX + 5];
int aib[NMAX + 5];

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

void update(int poz, int n, int val) {
  for (; poz <= n; poz += (poz & -poz))
    aib[poz] = max(aib[poz], val);
}

int query(int poz) {
  int ans = 0;
  for (; poz; poz -= (poz & -poz))
    ans = max(ans, aib[poz]);
  return ans;
}

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].ind = i;
  }
  sort(q + 1, q + m + 1);
  int j = m;
  for (int i = n; i >= 1; --i) {
    if (last[a[i]] != 0)
      update(last[a[i]], n, last[a[i]] - i);
    last[a[i]] = i;
    while (j > 0 && q[j].l == i) {
      sol[q[j].ind] = query(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;
}