void merge_sort(int* A,int x,int y,int *T)//[x,y)
{
if(y-x>1)
{
int m=x+(y-x)/2;//注意这种写法
int p=x,q=m,i=x;
merge_sort(A,x,m,T);merge_sort(A,m,y,T);//[x,m),[m,y)
while(p<m||q<y)
{
if(q>=y||p<m&&p<m&&A[p]<=A[q]) T[i++]=A[p++];
else T[i++]=A[q++];
}
for(int i=x;i<y;i++)
A[i]=T[i];//复制回A数组当中去
}
}//归并排序 O(nlog2n) O(n) 稳定 较复杂
int maxsum(int *A,int x,int y)//返回数组在左闭右开的区间中的最大连续和
{
if(y-x==1) return A[x];
int m=x+(y-x)/2;//划分区间 左闭右开
int maxs=max(maxsum(A,x,m),maxsum(A,m,y));
int v,L,R;
v=0,L=A[m-1];
for(int i=m-1;i>=x;i--) L=max(L,v+=A[i]);
v=0,R=A[m];
for(int i=m;i<y;i++) R=max(R,v+=A[i]);
return max(maxs,L+R);
}//O(nlog2n)