#include <iostream>
using namespace std;
const int N = 100005;
int n, m;
struct node
{
int l;
int r;
int max;
}tr[4*N]; //长度为N的区间,最多能产生4*N的
int w[N];
void bulid(int u, int l, int r)
{
if (l == r)
tr[u] = { l,r,w[r] };
else
{
tr[u] = { l,r };
int mid = l + r >> 1; //l+r/2
bulid(u << 1, l, mid); //去左边建树
bulid(u << 1 | 1, mid + 1, r); //去右边建树
tr[u].max = max(tr[u << 1].max, tr[u << 1 | 1].max);
}
}
int query(int u, int l, int r)
{//查询操作中l,r是始终不变的
if (l<=tr[u].l && tr[u].r <= r) //(l tr[u].l tr[u].r r)
return tr[u].max; //被完全包含,直接返回
int mid = tr[u].l+tr[u].r>> 1;
int x=-0x3f3f3f;
if (l <= mid) //左边超出,去左边寻找
x = max(x, query(u << 1, l, r));
if (r > mid) //右边超出,去右边寻找
x = max(x, query(u << 1 | 1, l, r));
return x;
}
void add(int u, int x, int v)
{
if (tr[u].l == tr[u].r)
{
tr[u].max += v;
return;
}
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) //去左边寻找
add(u << 1, x, v);
else //去右边寻找
add(u << 1 | 1, x, v);
//更新当前结点的最大值
tr[u].max = max(tr[u << 1].max, tr[u << 1 || 1].max);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i = 1;i <= n;i++)
scanf("%d",&w[i]);
int x, y;
bulid(1, 1, n);
while (m--)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,x,y));
}
return 0;
}
数列区间最大值
最新推荐文章于 2022-03-28 21:36:07 发布