int QueryTree(int node,int str,int end) { int left=node<<1, right=left+1; if(xx[node]>end || yy[node]<str) return -1; if(xx[node]>=str && yy[node]<=end) return Tree[node]; return max(QueryTree(left,str,end),QueryTree(right,str,end)); }
int SegmentTree::QueryTree(int iter_start, int iter_end, int root, int q_start, int q_end) { if (q_start > iter_end || q_end < iter_start) { return INFINITE; } if (iter_start >= q_start && iter_end <= q_end) { return _segment_tree[root].value; } int mid = (iter_start + iter_end) / 2; return std::min(QueryTree(iter_start, mid, 2*root+1, q_start, q_end), QueryTree(mid+1, iter_end, 2*root+2, q_start, q_end)); }
int main() { int i,j,k,l,m,n,q,t,x,y,a,b,blank=0,test=0; while(scanf("%d %d",&n,&q) && n) { memset(cnt,0,N1*sizeof(int)); for(i=0;i<n;i++) { scanf("%d",&num[i]); num[i]+=N, cnt[num[i]]++; if(cnt[num[i]]==1) start[num[i]]=i; } BuildSegmentTree(1,0,n-1); for(i=0;i<q;i++) { scanf("%d %d",&a,&b); a--, b--; if(num[a]==num[b]) { printf("%d\n",b-a+1); continue; } x=(k=start[num[a]]+cnt[num[a]])-a; y=b-(l=start[num[b]]-1); printf("%d\n",k<=l ? max(max(x,y),QueryTree(1,k,l)) : max(x,y)); } } return 0; }
int SegmentTree::Query(int start, int end) { return QueryTree(0, _count, 0, start, end); }