Pagini recente » Cod sursa (job #890303) | Cod sursa (job #506842) | Cod sursa (job #2561099) | Cod sursa (job #2519694) | Cod sursa (job #1771973)
#include <fstream>
#include <vector>
#include <algorithm>
#define nMax 100001
#define qMax 100001
#define valMax 100001
#define pb push_back
#define lNode 2*node
#define rNode 2*node+1
using namespace std;
ifstream fin("pq.in");
ofstream fout("pq.out");
int n, nrQ;
int Sol[qMax], v[nMax], last[valMax], arb[4*nMax];
struct question
{
int st;
int dr;
int poz;
}q[qMax];
bool cmp(question a, question b)
{
return a.dr<b.dr;
}
void read()
{
fin>>n>>nrQ;
for(int i=1; i<=n; i++)
fin>>v[i];
for(int i=1; i<=nrQ; i++)
{
fin>>q[i].st>>q[i].dr;
q[i].poz=i;
}
}
void upDate(int node, int st, int dr, int poz, int val)
{
if(st==dr)
{
arb[node]=val;
return;
}
int mid=st+(dr-st)/2;
if(poz<=mid)
upDate(lNode, st, mid, poz, val);
else
upDate(rNode, mid+1, dr, poz, val);
arb[node]=max(arb[lNode], arb[rNode]);
}
int query(int node, int st, int dr, int pozst, int pozdr)
{
int Max=0;
if(st>=pozst && dr<=pozdr)
return arb[node];
int mid=st+(dr-st)/2;
if(pozst<=mid)
Max=max(Max, query(lNode, st, mid, pozst, pozdr));
if(pozdr>mid)
Max=max(Max, query(rNode, mid+1, dr, pozst, pozdr));
return Max;
}
void solve()
{
int index=1;
sort(q+1, q+nrQ+1, cmp);
for(int i=1; i<=n; i++)
{
if(last[v[i]])
upDate(1, 1, n, last[v[i]], i-last[v[i]]);
last[v[i]]=i;
while(q[index].dr<=i && index<=nrQ)
{
int Max=query(1, 1, n, q[index].st, q[index].dr);
if(Max==0)
Max=-1;
Sol[q[index].poz]=Max;
index++;
}
}
}
void write()
{
for(int i=1; i<=nrQ; i++)
fout<<Sol[i]<<'\n';
}
int main()
{
read();
solve();
write();
}