树状数组用于解决动态查询区间,单点修改的情况
前缀和用于解决静态区间和的情况
差分用于解决多次修改区间值,最后求和(用前缀和)的情况
st表模板
#include<iostream>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int a[1000010],st[1000010][32];
int query(int l,int r) {
int k = 0;
while(1<<k <= r-l+1) k++;k--; //最后多加了一次
return max(st[l][k],st[r-(1<<k)+1][k]);
}
int main() {
int n = read(),m = read();
// cout<<n<<m<<endl;
for(int i=0;i<n;i++) a[i] = read();
for(int i=0;i<n;i++) {
st[i][0] = a[i];
}
for(int j=1;(1<<j)<=n;j++)
for(int i=0;i+(1<<j-1)-1<n;i++) {
st[i][j] = max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
while (m--) {
int l=read(),r=read();
printf("%d\n",query(l-1,r-1));
}
return 0;
}
网友评论