NYOJ_119_兵士が敵を殺す(三)
4363 ワード
RMQ問題:典型的なSTアルゴリズムで通過できる.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<queue>
using namespace std;
#define MAXN 100010
int maxsum[MAXN][18],minsum[MAXN][18],n;
void RMQ()
{
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i+(1<<j)-1<=n;++i)
{
maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]);
minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]);
}
}
int main()
{
int i,query,L,R;
while(~scanf("%d%d",&n,&query))
{
for(int i=1;i<=n;++i)
{
scanf("%d",&maxsum[i][0]);
minsum[i][0]=maxsum[i][0];
}
RMQ();
while(query--)
{
scanf("%d%d",&L,&R);
int k=(int)((log(R-L+1))/log(2.0));
int minval=min(minsum[L][k],minsum[R-(1<<k)+1][k]);
int maxval=max(maxsum[L][k],maxsum[R-(1<<k)+1][k]);
printf("%d
",maxval-minval);
}
}
return 0;
}