Pagini recente » Cod sursa (job #2334381) | Cod sursa (job #1748115) | Cod sursa (job #1549117) | Cod sursa (job #1434157) | Cod sursa (job #1709461)
#include <fstream>
#include <deque>
#include <algorithm>
using namespace std;
ifstream f("pq.in");
ofstream g("pq.out");
long n,i,j,q,rez[100005],lg,st,last[100005],rez2[100005];
deque<int> dq;
struct interval{
long x,y,poz;
}C[100005],Q[100005];
bool comp(interval a,interval b)
{
if (a.y==b.y)
return a.x<b.x;
return a.y<b.y;
}
bool comp2(interval a,interval b)
{
if (a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
int main()
{
f>>n>>q;
for (i=1;i<=n;i++)
{
int x;
f>>x;
if (last[x]!=0)
{
C[++lg].x = last[x];
C[lg].y = i;
}
last[x]=i;
}
for (i=1;i<=q;i++)
{
f>>Q[i].x>>Q[i].y;
Q[i].poz=i;
}
sort(C+1,C+lg+1,comp);
sort(Q+1,Q+q+1,comp2);
st=1;
i=1;
j=1;
while (st<=lg && j<=q)
{
while (C[i].y<=Q[j].y && C[i].x>=Q[j].x)
{
int sav=C[i].y-C[i].x+1;
while (!dq.empty() && C[dq.back()].y-C[dq.back()].x+1<=sav)
{
dq.pop_back();
st++;
}
dq.push_back(i);
i++;
}
while (C[st].x<Q[j].x && C[st].y<=Q[j].y && !dq.empty())
{
if (dq.front()==st)
dq.pop_front();
st++;
}
if (!dq.empty())
rez[j]=C[dq.front()].y-C[dq.front()].x;
else
rez[j]=-1;
j++;
}
for (i=1;i<=q;i++)
{
if (rez[i]==0)
rez[i]=-1;
rez2[Q[i].poz] = rez[i];
}
for (i=1;i<=q;i++)
g<<rez2[i]<<'\n';
return 0;
}