Example #1
0
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));
}
Example #2
0
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));
}
Example #3
0
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;
}
Example #4
0
int SegmentTree::Query(int start, int end)
{
    return QueryTree(0, _count, 0, start, end);
}