红+黑求调
查看原帖
红+黑求调
553904
yingbowen楼主2022/11/30 22:53
#include <bits/stdc++.h>
using namespace std;
long long n,q;
struct sst{
	long long num,pl;
}st[100005][25];
struct round{
	long long d,c,nxt;
	long long zhao;
}rd[100005];
void quary(long long r,long long v){
	if(rd[r].c >= v){
		printf("%lld\n",r);
		return;
	}
	if(rd[r].nxt == r){
		printf("%lld\n",0);
		return;
	}
	quary(rd[r].nxt,v-rd[r].c);
}
int main(){
	cin >> n >> q;
	for(int i = 1;i<=n;i++){
		cin >> rd[i].d >> rd[i].c;
		st[i][0].num = rd[i].d;
		st[i][0].pl = i;
		rd[i].nxt = i;
		rd[i].zhao = 0;
	}
	for(int i = 1;i<=20;i++){
		for(int j = 1;j<=n;j++){
			st[j][i] = st[j][i-1];
			if(j+(1<<(i-1)) > n){
				continue;
			}
			if(st[j][i].num < st[j+(1<<(i-1))][i-1].num){//找到下一个桶了
				if(rd[j].zhao==0)rd[j].nxt = st[j+(1<<(i-1))][i-1].pl;
				rd[j].zhao = 1;
				st[j][i].num = st[j+(1<<(i-1))][i-1].num;
				st[j][i].pl = st[j+(1<<(i-1))][i-1].pl;
			}
		}
	}
	long long r=0,v=0;
	for(int i = 1;i<=q;i++){
		cin >> r >> v;
		quary(r,v);
	}
}
2022/11/30 22:53
加载中...