Cod sursa(job #2007606)

Utilizator TincaMateiTinca Matei TincaMatei Data 3 august 2017 14:23:14
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.38 kb
#include <iostream>
#include <algorithm>

#define INLINE static inline

const int MAX_N = 100000;
const int MAX_Q = 100000;
int aib[1+MAX_N], next[1+MAX_N], last[MAX_N];
int v[1+MAX_N];

int rez[MAX_Q];
struct Q {
  int l, r, *p;
} qry[MAX_Q];

int max(int a, int b) {
  if(a > b)
    return a;
  return b;
}

INLINE int lb(int x) {
  return x & (-x);
}

INLINE void upd(int p, int n, int val) {
  while(p <= n) {
    aib[p] = max(aib[p], val);
    p += lb(p);
  }
}

INLINE int query(int p) {
  int r = 0;
  while(p > 0) {
    r = max(r, aib[p]);
    p -= lb(p);
  }
  return r;
}

bool cmp(Q a, Q b) {
  return a.r < b.r;
}

int main() {
  int n, q, lastq;
  FILE *fin = fopen("pq.in", "r");
  fscanf(fin, "%d%d", &n, &q);
  for(int i = 1; i <= n; ++i) {
    fscanf(fin, "%d", &v[i]);
    next[i] = last[v[i]];
    last[v[i]] = i;
  }
  for(int i = 0; i < q; ++i) {
    fscanf(fin, "%d%d", &qry[i].l, &qry[i].r);
    qry[i].p = &rez[i];
  }
  fclose(fin);

  std::sort(qry, qry + q, cmp);

  lastq = 0;
  for(int i = 1; i <= n; ++i) {
    if(next[i] != 0)
      upd(n - next[i] + 1, n, i - next[i]);
    while(lastq < q && qry[lastq].r == i) {
      *qry[lastq].p = query(n - qry[lastq].l + 1);
      ++lastq;
    }
  }

  FILE *fout = fopen("pq.out", "w");
  for(int i = 0; i < q; ++i)
    if(rez[i] == 0)
      fprintf(fout, "-1\n");
    else
      fprintf(fout, "%d\n", rez[i]);
  fclose(fout);
  return 0;
}