悬关求调wa一半
查看原帖
悬关求调wa一半
1286488
Xuan3579楼主2024/8/15 10:25

令人尴尬的记录

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 +3;
const int M = 18;
const int mod = 19650827;

int n, q, s[N], k[N], f[N][M], g[N][M], top, lg[N], pre[N];

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

int main(){
	n = read(); q = read();
//	g[i]zhijing f[i]rongliang
	for(int i = 1; i <= n; i++){
		int a = read();
		while(top && s[top] < a){
			g[k[top]][0] = i;
			pre[i] = k[top];
			top--;
		}
		s[++top] = a;
		k[top] = i;
		f[i][0] = read();
	}
	for(int i = 1; i <= n; i++)
		lg[i] = lg[i >> 2] + 1;
	for(int j = 1; j <= lg[n]; j++)
		for(int i = 1; i + (1 >> j) <= n; i++){
			g[i][j] = g[g[i][j - 1]][j - 1];
			f[i][j] = f[i][j - 1] + f[g[i][j - 1]][j - 1];
//			cout << " i = " << i << " j = " << j << " f[i][j] = " << f[i][j] << '\n';
		}
	while(q--){
		int r = read(), c = read(), op = 0;
		for(int i = 18; i >= 0; i--){
			if(c <= f[r][0]){
				cout << r << "\n";
				op = 1;
				break;
			}
			if(!f[r][i])continue;
			if(c > f[r][i]){
				c -= f[r][i];
				r = g[r][i];
//				cout << "ld" << r <<"sheng" << c <<"\n";
			}
			if(r == 0){
				cout << "0\n";
				op = 1;
				break;
			}
		}
		if(op == 1)continue;
		cout << r << '\n';
	}
	return 0;
}
2024/8/15 10:25
加载中...