比赛 26暑假集训模拟赛2 评测结果 AAAAAAAAAAATTTTTTTTT
题目名称 丹钓战 最终得分 55
用户昵称 对立猫猫对立 运行时间 14.464 s
代码语言 C++ 内存使用 48.58 MiB
提交时间 2026-07-02 11:13:10
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
#define maxn 500005
#define second second
using namespace std;
int n, q, l, r;
int a[maxn], b[maxn];
deque<pair<pair<int, int>, int> > st;
int nxt[21][maxn];
signed main() {
	freopen("stack.in", "r", stdin);
	freopen("stack.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> q;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for(int i = 1; i <= n; i++) {
		cin >> b[i];
	}
	for(int i = 1; i <= n; i++) {
		while(!st.empty() && (st.back().first.first == a[i] || st.back().first.second <= b[i])) {
			nxt[0][st.back().second] = i;
			st.pop_back();
		}
		st.push_back({{a[i], b[i]}, i});
	}
	for(int i = 1; i <= 20;i++) {
		for(int j = 1; j <= n; j++) {
			nxt[i][j] = nxt[i - 1][nxt[i - 1][j]];
		}
	}
	int cnt = 1;
	while(q--) {
		cin >> l >> r;
		int i = l;
		for(int step = 20; step >= 0; step--) {
			if(nxt[step][i] && nxt[step][i] <= r) {
				cnt += (1 << step);
				i = nxt[step][i];
			}
		}
		cout << cnt << endl;
		cnt = 1;
	}
	return 0;
}