详见原文 http://blog.sina.com.cn/s/blog_6635898a0100kzpx.html
#include <stdio.h>
#define M 100005
struct data
{
l,r,max;
}node[3*M];
struct da
{
start,end;
}seg[M];
int num[M],hash[M];
int Max (int a,int b)
{
> b?a:b;
}
void C_Tree (int left,int right,int u)
{
left;
right;
right)
node[u].max = seg[left].end - seg[left].start + 1;
return ;
(left + right)>>1;
(left,mid,u<<1);
(mid+1,right,(u<<1)+1);
= Max
(node[u<<1].max,node[(u<<1)+1].max);
}
int query (int left,int right,int u)
{
(node[u].l == left&&node[u].r ==
right)
return node[u].max;
(node[u].l + node[u].r)>>1;
/////////////////////////////////////
return query (left,right,u<<1);
>= mid + 1)
return query
(left,right,(u<<1)+1);
query (left,mid,u<<1);
query (mid+1,right,(u<<1)+1);
//////////////////////////////////////////
//这样写跟下面的写法有时竟然是一样AC和WA的关系 不明白
<=
mid)
//什么原因??
query (left,right,u<<1);
(left >= mid + 1)
query (left,right,(u<<1)+1);
int a = query (left,mid,u<<1);
int b = query
(mid+1,right,(u<<1)+1);
return Max (a,b);
}
int main ()
{
n,m,i,k,loc,a,b;
("%d",&n)&&n)
scanf ("%d",&m);
for (i = 1;i <= n;i ++)
scanf ("%d",&num[i]);
k = 0;
loc = 100005;
for (i = 1;i <= n;i ++)