#include <iostream>
#include <cmath>
using namespace std;
#define N 50010
int maxl[N][16], minl[N][16];
int n, m, a[N];
int min(int a, int b)
{
if (a>b) return b; return a;
}
int max(int a, int b)
{
if (a>b) return a; return b;
}
void S_table()
{
int l = int(log((double)n)/log(2.0));
for (int j=1;j<=l;j++)
{
for (int i=1; i + (1 << (j-1) ) - 1 <=n;++i)
{
maxl[i][j] = max(maxl[i][j-1], maxl[i + (1 << (j-1) )][j-1]);
minl[i][j] = min(minl[i][j-1], minl[i + (1 << (j-1) )][j-1]);
}
}
}
int rmq(int l, int r)
{
int k = int(log((double)(r-l+1))/log(2.0));
int a1 = max(maxl[l][k], maxl[r - (1<<k) + 1][k]);
int a2 = min(minl[l][k], minl[r - (1<<k) + 1][k]);
printf("Max: %d Min: %d\n", a1, a2);
}
int main()
{
while (~scanf("%d %d", &n, &m)) //n long m query
{
for (int i=1;i<=n;++i)
{
scanf("%d", &a[i]);
maxl[i][0] = minl[i][0] = a[i];
}
S_table();
int a, b;
while (m--)
{
scanf("%d %d", &a, &b);
rmq(a, b);
}
}
return 0;
}
rmq 模板
最新推荐文章于 2022-09-04 00:22:55 发布