题目描述
输入一串数字,给你M个询问,每次询问就给你两个数字 X,Y要求你说出 X到Y 这段区间内的最大数。
输入输出格式
输入格式:
第一行两个整数N,M 表示数字的个数和要询问的次数;
接下来一行为N 个数;
接下来M 行,每行都有两个整数X,Y 。
输出格式:
输出共m行,每行输出一个数。
这个代码死循环,求助
#include<iostream>
#include<cmath>
#include<algorithm>
#ifndef ONLINE_JUDGE // 洛谷判断
#pragma GCC optimize(2) // 火车头 (O2)
#endif
using namespace std;
const int N = 1e5 + 5;
int st[N][30], a[N], lg[N], n, m;
void preLg() // 预处理 ∑{ i = 1, i <= n : log2(i) }
{
lg[1] = 0;
for ( int i = 2; i <= n; i++ ) { lg[i] = lg[i / 2] + 1; }
}
void preST() // 初始化 ST 表
{
for ( int i = 1; i <= n; i++ ) { st[i][0] = a[i]; }
for ( int j = 1; j <= ( int ) lg[n]; j++ ) for ( int i = 1; i <= n; i++ ) { st[i][j] = max ( st[i][j - 1], st[i + ( 1 << ( j - 1 ) )][j - 1] ); }
}
int query ( int x, int y )
{
int len = lg[y - x + 1];
return st[x][len - 1] + st[y - ( 1 << ( len - 1 ) )][len - 1];
}
int main()
{
preLg();
cin >> n >> m;
for ( int i = 1; i <= n; i++ ) { cin >> a[i]; }
preST();
for ( int x, y, i = 0; i < m; i++ )
{
cout << query ( x, y ) << endl;
}
return 0;
}
Thanks