Pagini recente » Cod sursa (job #905723) | Cod sursa (job #1466283) | Cod sursa (job #2210310) | Cod sursa (job #461500) | Cod sursa (job #1713578)
#include <cstdio>
#include<algorithm>
#define MAX 100000
#define LOG 17
using namespace std;
int rmq[LOG][MAX+1];
struct aa{
int st, dr;
}v[MAX+1];
int fr[MAX+1], k, l[MAX+1];
inline int maxim(int a, int b)
{
if(a>b)
return a;
return b;
}
bool cresc(const aa &a, const aa &b)
{
if(a.st<b.st)
return true;
if(a.st>b.st)
return false;
return (a.dr<b.dr);
}
void calculate(int n)
{
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i<=n;++i)
rmq[j][i]=maxim(rmq[j-1][i], rmq[j-1][i+(1<<(j-1))]);
}
inline int query(int x, int y)
{
int l1=-1, l2=-1, st, dr, mij, log;
st=0;
dr=k;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[mij].st<x)
{
l1=mij+1;
st=mij+1;
}
else dr=mij-1;
}
st=0;
dr=k;
while(st<=dr)
{
mij=(st+dr)/2;
if(v[mij].dr<=y)
{
l2=mij;
st=mij+1;
}
else dr=mij-1;
}
if(l1<1 || l2<1 || l1>l2)
return -1;
for(log=0;(1<<log)<=(l2-l1+1);++log);
log--;
return maxim(rmq[log][l1], rmq[log][l2-(1<<log)+1]);
}
int main()
{
freopen("pq.in", "r", stdin);
freopen("pq.out", "w", stdout);
int n, q, x, y;
scanf("%d%d", &n, &q);
for(int i=1;i<=n;++i)
{
scanf("%d", &x);
if(fr[x]!=0)
{
v[++k].st=fr[x];
v[k].dr=i;
}
fr[x]=i;
}
sort(v+1, v+k+1, cresc);
for(int i=1;i<=k;++i){
l[i]=v[i].dr-v[i].st;
rmq[0][i]=l[i];
}
calculate(n);
for(int i=1;i<=q;++i)
{
scanf("%d%d", &x, &y);
printf("%d\n", query(x, y));
}
return 0;
}