ST表

 

 

 

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int maxn = 100005;
int f[maxn][20], logn[maxn], n, m, a[maxn];
void pre() {
	logn[1] = 0;
	logn[2] = 1;
	for (int i = 3; i <= n; i++) {
		logn[i] = logn[i / 2] + 1;
	}
}

void init() {
	memset(f, -1, sizeof(f));
	pre();
	for (int i = 1; i <= n; i++) f[i][0] = a[i];
	for (int i = 1; i <= logn[n]; i++) {
		for (int j = 1; j + (1 << i) - 1 <= n; j++) {
			f[j][i] = max(f[j][i - 1], f[j + (1 << (i - 1))][i - 1]);
		}
	}
}

int query(int x, int y) {
	int s = logn[y - x + 1];
	return max(f[x][s], f[y - (1 << s) + 1][s]);
}

int main() {
//	freopen("test.in", "r", stdin);
	cin >> n >> m; 
	for (int i = 1; i <= n; i++) cin >> a[i];
	init();
	for (int i = 1; i <= m; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		printf("%d\n", query(x, y));
	}
	return 0;
}

  

 

posted @ 2021-03-17 00:20  大W  阅读(22)  评论(0)    收藏  举报