8分求助TLE(开了O2)
查看原帖
8分求助TLE(开了O2)
877156
yyy_Logic楼主2023/7/29 19:48
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long double ld;
typedef long long ll;
#define endl '\n'
#define test printf("\ntest\n")
/*·········································*/
const int N = 1e6+10;
int Max[N][20];//Max[i][j]表示第i个数到其后面第2的j次方的数中的最大值
int n,m;

inline int read(){
	char c=getchar();
	int x=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')
			c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return f*x;
}
int query(int l ,int r){
//	int log2[N];
//	log2[1]=0;
//	for(int i=2;i<=n;i++){//预存log2的值
//		log2[i]=log2[i>>1]+1;
//	}
//	int k=log2[r-l+1];
	int k=log2(r-l+1);
	return max(Max[l][k],Max[r-(1<<k)+1][k]);
}
void solve()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)//初始化区间(i,i)的最大值为其本身
		Max[i][0]=read();
	//关键
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n-(1<<j)+1;i++){//注意边界
			Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);//(1<<(j-1))相当于2的j-1次方
		}
	}
	for(int i=1;i<=m;i++){
		int l=read(),r=read();
		printf("%d\n",query(l,r));
	}
}
int main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0),cout.tie(0);
	int t = 1;
//	cin>>t;
	while(t--) solve();
	return 0;
}
2023/7/29 19:48
加载中...