Pagini recente » Cod sursa (job #2527771) | Cod sursa (job #92673) | Cod sursa (job #441521) | Cod sursa (job #1185823) | Cod sursa (job #1909960)
#include <bits/stdc++.h>
using namespace std;
int n, q, aint[400000], last[100000], M, i, L, R, Z, x, query(int, int, int), st[100010], ans[100010];
vector<pair<int, int> > Q[100010];
int main()
{
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
cin >> n >> q;
for(M = 1; M < n; M *= 2);
Z = M-1;
for(i = 1; i <= n; i++)
{
cin >> x;
st[i] = i;
if(last[x]) st[i] = last[x];
last[x] = i;
}
for(i = 1; i <= q; i++)
{
cin >> L >> R;
Q[R].push_back({L, i});
}
for(R = 1; R <= n; R++)
{
int poz = Z + st[R];
int val = R - st[R];
aint[poz] = val;
for(poz /= 2; poz; poz /= 2)
aint[poz] = max(aint[2*poz], aint[2*poz+1]);
for(auto it : Q[R])
{
L = it.first;
ans[it.second] = query(1, M, 1);
}
}
for(i = 1; i <= q; i++)
cout << (ans[i] ? ans[i] : -1) << '\n';
return 0;
}
int query(int st, int dr, int nod)
{
int mi = (st+dr)/2;
if(st > R || L > dr)
return 0;
if(L <= st && dr <= R)
return aint[nod];
return max(query(st, mi, 2*nod), query(mi+1, dr, 2*nod+1));
}