RMQ求救!!!

  1. [倍增基础]RMQ
    题目ID:7144必做题100分
    最新提交:
    Time Limit Exceeded
    50 分
    历史最高:
    Time Limit Exceeded
    50 分
    时间限制: 1000ms
    空间限制: 256000kB
    题目描述
    [题目描述]

给你一个长度为n的数组,有q组询问,每次询问一个区间内所有数字的极差(max-min)。

[输入格式]

第一行,一个正整数n,表示数组长度。

第二行,n个正整数a[i],表示给定数组。

第三行,一个正整数q,表示询问数。

接下来q行,每行两个正整数l,r,表示询问的区间。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],q,f1[N][20],f2[N][20];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		f1[i][0]=a[i];
		f2[i][0]=a[i];
	}
	scanf("%d",&q);
    int lgn=int(log(n)/log(2));
	for(int j=1;j<=lgn;j++){
        int x=(1<<(j-1));
		for(int i=1;i<=n;i++){
			f1[i][j]=max(f1[i][j-1],f1[i+x][j-1]);
			f2[i][j]=min(f2[i][j-1],f2[i+x][j-1]);
		}
	}
	while(q--){
		int l,r;
		scanf("%d %d",&l,&r);
		int g=int(log(r-l+1)/log(2));
	    printf("%d\n",max(f1[l][g],f1[r-(1<<g)+1][g])-min(f2[l][g],f2[r-(1<<g)+1][g]));
	}
}

1~5AC,6~10TLE,真无语
哪位大佬能帮忙看一下?

建议把开个log数组自己算,c++自带的函数可能常数太大了

log[1]=0
log[i]=log[i>>1]+1

@Erin 要不先关帖,我自己改