View Code of Problem 2897

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define MAX 200001
#define maxs(a,b)a>b?a:b
#define mins(a,b)a<b?a:b
int dp1[MAX][40],dp2[MAX][40],n,m,a[MAX];
void RMQ_init()
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		dp1[i][0]=a[i];
		dp2[i][0]=a[i];
	}
/*	for(j=1;(1<<j)<=n;j++)
		for(i=1;i+(1<<j)-1<=n;i++)
		{
			dp1[i][j]=maxs(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
			dp2[i][j]=mins(dp2[i][j-1],dp1[i+(1<<(j-1))][j-1]);
		}
		*/
int end_j=log(n+0.0)/log(2.0);
  int end_i;
  for(int j=1;j<=end_j;j++){
    end_i=n+1-(1<<j);
    for(int i=1;i<=end_i;i++){
      dp1[i][j]=maxs(dp1[i][j-1],dp1[i+(1<<(j-1))][j-1]);
      dp2[i][j]=mins(dp2[i][j-1],dp2[i+(1<<(j-1))][j-1]);
    }
  }
}
int get_big_rmq(int a,int b)
{
    int k=(int)(log((double)(b-a+1))/log(2.0));
    return maxs(dp1[a][k],dp1[b-(1<<k)+1][k]);
}
int get_min_rmq(int a,int b)
{
    int k=(int)(log((double)(b-a+1))/log(2.0));
    return mins(dp2[a][k],dp2[b-(1<<k)+1][k]);
}
int main()
{
	//freopen("in","r",stdin);
	int i,x,y;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		RMQ_init();
		for(i=0;i<m;i++)
			{
				scanf("%d%d",&x,&y);
				printf("%d\n",get_big_rmq(x,y)-get_min_rmq(x,y));
			}
	}
	return 0;
}

Double click to view unformatted code.


Back to problem 2897