Pagini recente » Cod sursa (job #2307296) | Cod sursa (job #2751174) | Cod sursa (job #1191683) | Cod sursa (job #3269964) | Cod sursa (job #2242509)
#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;
}