RMQ 模板题,求区间最大值,求助
#include<iostream>
#include<cmath>
#include<algorithm>
#ifndef ONLINE_JUDGE
#pragma GCC optimize(2)
#endif
using namespace std;
const int N = 1e5 + 5;
int st[N][30], a[N], lg[N], n, m;
void preLg()
{
lg[1] = 0;
for ( int i = 2; i <= n; i++ ) { lg[i] = lg[i / 2] + 1; }
}
void preST()
{
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()
{
cin >> n >> m;
preLg();
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;
}