| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
AC~欢迎交流http://blog.csdn.net/luckcircle/article/details/53088099
博客有详解,不会的童鞋可以去看一下
#include<stdio.h>
struct node{
int max;
int min;
int left;
int right;
}Node[50005*3];
int min (int a,int b)
{
return a > b?b:a;
}
int max (int a,int b)
{
return a > b?a:b;
}
int a[50005];
int low=1000001,hei=0;
void buildtree(int father,int left,int right){
Node[father].left=left;
Node[father].right=right;
if(left==right){
Node[father].max=a[left];
Node[father].min=a[right];
return;
}
else{
buildtree(father*2,left,(left+right)/2);
buildtree(father*2+1,(left+right)/2+1,right);
if(Node[father*2].max>=Node[father*2+1].max){
Node[father].max=Node[father*2].max;
}
else{
Node[father].max=Node[father*2+1].max;
}
if(Node[father*2].min<Node[father*2+1].min){
Node[father].min=Node[father*2].min;
}
else{
Node[father].min=Node[father*2+1].min;
}
}
}
void query(int father, int left, int right)
{
int mid;
if(Node[father].left==left&&Node[father].right==right){
low=min(low,Node[father].min);
hei=max(hei,Node[father].max);
return;
}
mid=(Node[father].left+Node[father].right)/2;
if(right<=mid){
query(father*2,left,right);
}
else if(left>=mid+1){
query(father*2+1,left,right);
}
else
{
query(father*2,left,mid);
query(father*2+1,mid+1,right);
}
}
int main(){
int i,n,q,left,right;
scanf("%d %d",&n,&q);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
buildtree(1,1,n);
for(i=1;i<=q;i++){
scanf("%d %d",&left,&right);
query(1,left,right);
printf("%d\n",hei-low);
low = 1000001;
hei = 0;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator