一塌糊涂
查看原帖
一塌糊涂
443023
chenkuo楼主2023/10/17 09:41
#include<bits/stdc++.h>
#define longint long long
using namespace std;
inline longint read(){
	char ch=getchar();int x=0;bool flag=0;
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') flag=1,ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	if(flag) return -x;return x;
} 
longint n,q,st[100001],z,f[100001][25],g[100001][25],r,v,nex[100001];
struct asd{
	longint d,c;
}a[100001];
void dfs(longint name,longint v){
//	if(a[name].c>=v){
//		printf("%lld\n",name);
//		return;
//	}
	if(name==n+1){
		printf("0\n");return;
	}
	longint ls=20;
	while(ls>=0&&g[name][ls]>v) ls--;
	if(ls==-1){
		if(f[name][0]==n+1)	printf("0\n");
		else printf("%lld\n",f[name][0]);
		return;
	}
	dfs(f[name][ls],v-g[name][ls]);
}
int main(){
	n=read();q=read();
	for(int i=1;i<=n;i++) a[i].d=read(),a[i].c=read();
	st[++z]=1;a[n+1].d=2e18;a[n+1].c=2e18;
	for(int i=2;i<=n+1;i++){
		while(z>0&&a[st[z]].d<a[i].d) nex[st[z]]=i,z--;
		st[++z]=i;
	}
	for(int i=0;i<100001;i++) for(int j=0;j<25;j++) f[i][j]=-1,g[i][j]=2e18;
	for(int i=1;i<=n;i++) f[i][0]=nex[i],g[i][0]=a[nex[i]].c;
	for(int i=1;(1<<i)<=n;i++){
		for(int j=1;j<=n;j++){
			if(j+(1<<(i-1))>=n) break;
			f[j][i]=f[f[j][i-1]][i-1];
			if(f[j][i]==n+1||f[j][i]==-1) break; 
			g[j][i]=g[j][i-1]+g[f[j][i-1]][i-1];
		}
	}
	while(q--){
		r=read();v=read();
		if(v-a[r].c<=0) printf("%lld\n",r);
		else dfs(r,v-a[r].c);
	}
}

样例过了,结果全错,还有两个超时

记录

2023/10/17 09:41
加载中...