set<node> s; set<node> ::iterator iter; node city[maxn]; int jl1,jl2; int n; int h[maxn]; int a[maxn][20],b[maxn][20],f[maxn][20]; int aa[maxn],bb[maxn]; map <int,int> ys; int x0;
//b先行动. voiddp(){ for (int i=1;i<=n;i++)f[i][0] = aa[bb[i]]; for (int i=1;i<=n;i++)if(bb[i])b[i][0] = abs(h[bb[i]]-h[i]); for (int i=1;i<=n;i++)if(aa[i])a[i][0] = abs(h[bb[i]]-h[aa[bb[i]]]); for (int j=1;j<=19;j++) for (int i=1;i<=n;i++){ f[i][j] = f[f[i][j-1]][j-1]; a[i][j] = a[i][j-1] + a[f[i][j-1]][j-1]; b[i][j] = b[i][j-1] + b[f[i][j-1]][j-1]; } }
voidrun(int s,int x){ int p=s; int x1=x; jl1=jl2=0; for (int i=19;i>=0;i--){ if (f[p][i]!=0&&a[p][i]+b[p][i]<=x1){ x1-=a[p][i]+b[p][i];jl1+=b[p][i];jl2+=a[p][i];p=f[p][i]; } } if(bb[p]&&b[p][0]<=x1)jl1+=b[p][0]; }
intmain(){ cin>>n; for (int i=1;i<=n;i++){ cin>>h[i]; city[i] = node(i,h[i]); s.insert(node(i,h[i])); ys[h[i]] = i; } for (int i=1;i<=n;i++){ iter = s.find(city[i]); int t=0; if(iter!=s.begin()){ iter--; tmp[++t] = make_pair(abs((*iter).h-city[i].h),(*iter). h); if (iter!=s.begin()){ iter--; tmp[++t] = make_pair(abs((*iter).h-city[i].h),(*iter).h);iter++; } iter++; } iter++; if(iter!=s.end()){ tmp[++t] = make_pair(abs((*iter).h-city[i].h),(*iter).h);iter++; if (iter!=s.end()){ tmp[++t] = make_pair(abs((*iter).h-city[i].h),(*iter).h); }iter--; }iter--; sort(tmp+1,tmp+t+1,cmp); if(t>=1)aa[i]=ys[tmp[1].second]; if(t>=2)bb[i]=ys[tmp[2].second]; //for (int i=1;i<=t;i++)cout<<tmp[i].second<<endl; //cout<<endl<<endl; s.erase(iter); }/* for (int i=1;i<=n;i++){ }*/ dp(); cin>>x0; double now=2147483647; int ans; int p; for (int s=1;s<n;s++){ run(s,x0); if(jl2!=0) if(double(jl1)/double(jl2)<=now+0.0000001&&double(jl1)/double(jl2)>=now-0.0000001) if(h[ans]<h[s])ans=s; if(double(jl1)/double(jl2)<now){ ans=s;now=double(jl1)/double(jl2); } } cout<<ans<<endl; int m,s0; cin>>m; for (int i=1;i<=m;i++){ cin>>s0>>x0; run(s0,x0); cout<<jl1<<" "<<jl2<<endl; } return0; }