ST表+单调队列求助
查看原帖
ST表+单调队列求助
678534
Eric998楼主2022/8/3 15:08

rt,样例过不了。

#include <iostream>
#include <vector>
#include <map>
#include <math.h>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define inf 0x3f3f3f3f
#define minf 0x3f
#define inp(x) cin>>x
#define otp(x) cout<<x
#define otp_nl(x) cout<<x<<"\n"
#define otp_sp(x) cout<<x<<" "
#define int long long
#define veci vector<int>
#define str string
#define pb(x) push_back(x)
#define fr(k,len) for(k=0;k<len;k++)
#define nfr(k,len) for(int k=0;k<len;k++)
#define ret return
#define db long double
#define all(x) x.begin(),x.end()

namespace my_stl {

}

int qpow(int a, int t, int p) {
	a %= p;
	int b[64];
	b[0] = a;
	nfr(i, 63)b[i + 1] = (b[i] * b[i]) % p;
	int ans = 1;
	nfr(i, 64) {
		if (t & (1 << i)) {
			ans *= b[i];
			ans %= p;
		}
	}
	ret ans;
}

int gcd(int a, int b) {
	ret (b ? (gcd(b, a % b)) : a);
}

int invp(int a, int p) {
	ret qpow(a, p - 2, p);
}
int x, y;

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-')
			f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - 48;
		ch = getchar();
	}
	return x * f;
}

void exgcd(int a, int b, bool f) {
	if (f)
		x = 0, y = 0;
	if (!b) {
		x = 1;
		y = 0;
		return;
	}
	exgcd(b, a % b, false);
	int tx = x;
	x = y;
	y = tx - a / b * y;
}

int inv(int a, int p) {
	exgcd(a, p, true);
	return (x + p) % p;
}
int logn[131072];
int st[131072][17];
int a[131072];

void logninit() {
	for (int i = 0; i < 131072; i++) {
		for (int j = 0; (1 << j) <= i; j++)
			logn[i] = j;
	}
}

void lineinit(int l) {
	int gap = 1 << l;
	deque<int> dq;
	for (int i = 0; i < 131072; i++) {
		while (dq.size() && a[dq.back()] < a[i])
			dq.pop_back();
		dq.push_back(i);
		if (i >= gap) {
			while (dq.front() <= i - gap)
				dq.pop_front();
			st[i - gap][l] = a[dq.front()];
		}
	}
}

void stinit() {
	for (int i = 0; i < 131072; i++)
		st[i][0] = a[i];
	for (int i = 1; i < 19; i++)
		lineinit(i);
}

void solve() {
	int n = read(), m = read();
	for (int i = 0; i < n; i++)
		a[i] = read();
	logninit();
	stinit();
	for (int i = 0; i < m; i++) {
		int l, r;
		cin >> l >> r;
		l--;
		int lne = logn[r - l];
		printf("%d\n", max(st[l][lne], st[r - (1 << lne)][lne]));
	}
	/*for (int i = 0; i < n; i++) {
		for (int j = 0; j <= logn[n]; j++) {
			cout << st[i][j] << ' ';
		}
		cout << endl;
	}*/
	ret;
}

signed main() {
	int t = 1;
	nfr(i, t) {
		solve();
	}
	ret 0;
}
2022/8/3 15:08
加载中...