补cf题的时候遇到了一个求区间最值的问题,之前只用过线段树,现在补一下树状数组求区间最值
例题是HDU1754
#include<iostream>
#include<cstring>
using namespace std;
const int N=2e5+10;
int n,m;
int a[N],h[N];
int lowbit(int x)
{
return x&-x;
}
void update(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
{
h[i]=a[i];
for(int j=1;j<lowbit(i);j<<=1)
h[i]=max(h[i],h[i-j]);
}
}
int query(int x,int y)
{
int ans=0;
while(x<=y)
{
ans=max(a[y],ans);
y--;
for(;y-lowbit(y)>=x;y-=lowbit(y))
ans=max(ans,h[y]);
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
while(cin>>n>>m)
{
memset(h,0,sizeof(h));
for(int i=1;i<=n;i++)
{
cin>>a[i];
update(i);
}
while(m--)
{
char c;
int l,r;
cin>>c>>l>>r;
if(c=='Q') cout<<query(l,r)<<endl;
else
{
a[l]=r;
update(l);
}
}
}
return 0;
}