#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define inf -1*0x3f3f3f3f
#define MAXN 300000
using namespace std;
int tree[MAXN];int arr[MAXN];
int cnt=1;
void build(int root,int b,int e)
{
if(b==e)
tree[root]=arr[b];
else{
int mid=(b+e)/2;
build(root*2,b,mid);//递归构造左子树
build(root*2+1,mid+1,e);//递归构造右子树
tree[root]=max(tree[root*2],tree[root*2+1]);//父节点取子节点中最大的
}
}
int query(int root,int b,int e,int lf,int rg)//树的遍历
{
int p1,p2;
if(lf>e||rg<b)
return inf;//避免假想无穷大
if(b>=lf&&e<=rg)//如果整个区间被包含在搜寻区间直接返回该节点
return tree[root];
int mid=(b+e)/2;
p1=query(root*2,b,mid,lf,rg);
p2=query(root*2+1,mid+1,e,lf,rg);
return max(p1,p2);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(tree,-1,sizeof(tree));//根节点为1的树
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
build(1,0,n-1);
scanf("%d%d",&l,&r);
int ans=query(1,0,n-1,l-1,r-1);
}
}
数据结构之线段树
最新推荐文章于 2024-01-30 15:54:19 发布