30pts求调(悬2关)
查看原帖
30pts求调(悬2关)
947565
_ERO_楼主2023/11/25 18:19

rt,挂得莫名其妙,还想不到 hack

(debug没删)

#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;

const int MAXN = 100005;

int n, Q;
int d[MAXN], c[MAXN];
int f[MAXN][25], fa[MAXN][25];

int top, stc[MAXN];
inline void Init() {
	memset(f, 0x3f, sizeof(f));
	for (int i = 1; i <= n; ++ i)
		f[i][0] = c[i];
//	for (int i = 1; i <= n; ++ i) {
//		printf ("%lld : ", i);
//		for (int j = 0; j <= 20; ++ j)
//			printf ("%lld ", f[i][j]);
//		puts("");
//	}
	for (int i = 1; i <= n; ++ i) {
		while (top && d[stc[top]] < d[i]) fa[stc[top --]][0] = i;
		stc[++ top] = i;
	}
	for (int i = 1; i <= 20; ++ i)
		for (int j = 1; j <= n; ++ j) {
			if (j + (1 << (i - 1)) <= n)
				f[j][i] = f[j][i - 1] + f[j + (1 << (i - 1))][i - 1];
			fa[j][i] = fa[fa[j][i - 1]][i - 1];
		}
//	for (int i = 1; i <= n; ++ i) {
//		printf ("%lld : ", i);
//		for (int j = 0; j <= 20; ++ j)
//			printf ("%lld ", f[i][j]);
//		puts("");
//	}
}
inline int Query(int x, int v) {
	for (int i = 20; ~i; -- i)
		if (v > f[x][i]) 
			v -= f[x][i], x = fa[x][i];
	return x;
}

signed main()
{
	scanf ("%lld%lld", &n, &Q);
	for (int i = 1; i <= n; ++ i)
		scanf ("%lld%lld", d + i, c + i);
	Init();
	while (Q --) {
		int r, v; scanf ("%lld%lld", &r, &v);
		printf ("%lld\n", Query(r, v));
	}
	return 0;
} 
2023/11/25 18:19
加载中...