当前位置: 代码迷 >> 综合 >> poj 3264 (summerIII O) j树状数组 ST表(区间最值查询)
  详细解决方案

poj 3264 (summerIII O) j树状数组 ST表(区间最值查询)

热度:27   发布时间:2023-12-16 03:56:01.0
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn= 100000+50;
int n,m,a[maxn],mx[maxn][50],mn[maxn][50];//这里mx[maxn][范围内尽量取大一点]void init(){int m=floor(log((double)n)/log(2.0));for(int i=1;i<=n;i++) mx[i][0]=mn[i][0]=a[i];for(int i=1;i<=m;i++)for(int j=n;j;j--){mx[j][i]=mx[j][i-1];mn[j][i]=mn[j][i-1];if(j+(1<<(i-1))<=n){mx[j][i]=max(mx[j][i],mx[j+(1<<(i-1))][i-1]);mn[j][i]=min(mn[j][i],mn[j+(1<<(i-1))][i-1]);}}
}int query(int l,int r){int m=floor(log((double)(r-l+1))/log(2.0));int Max=max(mx[l][m],mx[r-(1<<m)+1][m]);int Min=min(mn[l][m],mn[r-(1<<m)+1][m]);return Max-Min;
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=1;i<=n;i++)scanf("%d",&a[i]);init();while(m--){int left,right;scanf("%d%d",&left,&right);int t=query(left,right);printf("%d\n",t);}}return 0;
}