Pagini recente » Cod sursa (job #1870916) | Cod sursa (job #1171399) | Cod sursa (job #98046) | Cod sursa (job #2843291) | Cod sursa (job #1712266)
#include <cstdio>
#include <algorithm>
#define MAXN 100000
#define MAXQ 100000
#define zeros(x) (x&(-x))
int last[MAXN+1],aib[MAXN+1],ans[MAXQ+1];
using namespace std;
struct querry{
int L,R,poz;
};
struct Punct{
int x,y;
};
Punct P[MAXN+1];
querry Q[MAXN+1];
bool cmp1(querry a,querry b){
return a.R<b.R;
}
bool cmp2(Punct a,Punct b){
return a.y<b.y;
}
inline void update(int poz,int val){
int i;
for(i=poz;i>0;i-=zeros(i))
if(aib[i]<val)
aib[i]=val;
if(i==0&&aib[0]<val)
aib[0]=val;
}
inline int querry(int poz,int n){
int i,max=0;
for(i=poz;i<=n;i+=zeros(i))
if(aib[i]>max)
max=aib[i];
return max;
}
int main(){
FILE*fi,*fout;
int i,j,n,q,nr;
fi=fopen("pq.in" ,"r");
fout=fopen("pq.out" ,"w");
fscanf(fi,"%d%d" ,&n,&q);
for(i=1;i<=n;i++){
fscanf(fi,"%d" ,&nr);
P[i].x=last[nr];
P[i].y=i;
last[nr]=i;
}
for(i=1;i<=q;i++){
fscanf(fi,"%d%d" ,&Q[i].L,&Q[i].R);
Q[i].poz=i;
}
sort(Q+1,Q+q+1,cmp1);
sort(P+1,P+n+1,cmp2);
j=1;
for(i=1;i<=q;i++){
while(j<=n&&P[j].y<=Q[i].R){
update(P[j].x,P[j].y-P[j].x);
j++;
}
ans[Q[i].poz]=querry(Q[i].L,n);
if(ans[Q[i].poz]==0)
ans[Q[i].poz]=-1;
}
for(i=1;i<=q;i++)
fprintf(fout,"%d\n" ,ans[i]);
fclose(fi);
fclose(fout);
return 0;
}