Pagini recente » Cod sursa (job #2840227) | Cod sursa (job #73608) | Cod sursa (job #1815722) | Cod sursa (job #3249804) | Cod sursa (job #1985369)
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<utility>
#define NMAX 100005
using namespace std;
int aint[4*NMAX];
int last[NMAX];
int viz[NMAX];
int a[NMAX];
int sol[NMAX];
void update(int nod ,int st,int dr,int pos ,int val){
if ( st >= dr )
{
aint[nod] = val;
return ;
}
int mij = (dr+st)/2;
if ( pos <= mij ) update(2*nod,st,mij,pos,val);
else update(2*nod+1,mij+1,dr,pos,val);
aint[nod] = (aint[2*nod] > aint[2*nod+1] ? aint[2*nod] :aint[2*nod+1]);
}
int query(int nod,int st,int dr,int st_b,int dr_b)
{
if ( st >= st_b && dr <= dr_b )
{
return aint[nod];
}
int mij = (dr+st)/2;
int scor;
if ( st_b <= mij ) scor = query(2*nod,st,mij,st_b,dr_b);
if ( dr_b > mij ) scor = std::max(scor,query(2*nod+1,mij+1,dr,st_b,dr_b));
return scor;
}
int main()
{
int n,q;
int val,left,right;
ifstream fin("pq.in");
ofstream fout("pq.out");
std::vector<std::pair<int,int> > end_at[NMAX];
fin>>n>>q;
for(int i = 1; i <= n ; ++i)
{
fin>>a[i];
}
for (int i = 1; i <= n ; ++i)
{
if ( viz[a[i]] != 0 )
{
last[i] = viz[a[i]];
}
else last[i] = -1;
viz[a[i]]=i;
}
for (int i = 0; i < q; ++i)
{
fin>>left>>right;
end_at[right].push_back(std::make_pair(left,i));
}
for (int i = 1 ; i <= n ; ++i)
{
if ( last[i] != -1)
{
update(1,1,n,last[i],i-last[i]);
}
for (int j = 0 ; j < end_at[i].size() ;++j)
{
sol[end_at[i][j].second] = query(1,1,n,end_at[i][j].first,i);
}
}
for(int i = 0 ; i < q ; ++i)
{
if (sol[i] == 0 ) fout<<"-1\n";
else fout<<sol[i]<<'\n';
}
return 0;
}