单调队列加倍增ST表
查看原帖
单调队列加倍增ST表
1562283
Mikumikumi123楼主2025/2/5 18:31

30分求条,我真的快疯了调了一下午了,就单调队列加倍增ST表

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<stack>
using namespace std;
stack<int>sta;
const int N = 200004;
int C[N];
int CV[N];
int V[N];
int st[N][20];
int st0[N][20];
int n, m;
int main() {
	cin >> n >> m;
	for (int i = 1;i <= n;i++) {
		cin >> C[i] >> V[i];
	}
	for (int i = 1;i <= n;i++) {
		while (!sta.empty() && C[sta.top()] <= C[i]) {
			int a = sta.top();
			sta.pop();
			CV[a] =i;
		}
		sta.push(i);
	}
	while (!sta.empty()) {
		int a = sta.top();
		sta.pop();
		CV[a] = 0;
	}
	for (int i = 1;i <= n;i++) {
		st[i][0] = CV[i];
		st0[i][0] = V[i];
	}
	for (int i = 1;i <= log2(n);i++) {
		for (int j = 1;j <= n;j++) {
			st[j][i] = st[st[j][i - 1]][i - 1];
			st0[j][i] = st0[j][i - 1] + st0[st[j][i - 1]][i - 1];
		}
	}
	for (int i = 0;i < m;i++) {
		int a, b;
		cin >> a >> b;
		int f = log2(n - a+1);
		for (int j = f;j >= 0;j--) {
			if (st0[a][j] < b) {
				b -= st0[a][j];
				a = st[a][j];
			}
		}
		if (a==0)cout << "0" << endl;
		else cout << a << endl;
	}
	return 0;
}

2025/2/5 18:31
加载中...