Pagini recente » Cod sursa (job #694734) | Cod sursa (job #313918) | Cod sursa (job #333066) | Cod sursa (job #2279558) | Cod sursa (job #2007606)
#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;
}