WA on #3,求助:
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct monitor{
int x,t,lab;
}a[100010];
int dy[100010];
int turn[100010],size=0;
bool cmp(monitor p,monitor q){
return p.t<q.t;
}
int mxv[100010],mxv2[100010],locmx[100010];
int mx,mx2,lmx;
int upp(int k){
int l=0,r=size;
while(l<r){
int mid=(l+r)/2;
if(turn[mid]>=k)r=mid;
else l=mid+1;
}
return r;
}
int up(int k){
int l=0,r=n;
while(l<r){
int mid=(l+r)/2;
if(a[mid].t>=k)r=mid;
else l=mid+1;
}
return r;
}
int getvv(int i,int k){
if(k==locmx[i])return mxv2[i];
else return mxv[i];
}
int getv(int k){
if(k>size)return 1919810;
if(k==lmx)return mx2;
else return mx;
}
int getanss(int u,int v){
int at=upp(u);
if(u==turn[at]&&u!=n){
return max(min(getv(at),getv(at+1)),min(getvv(at,u),getvv(at+1,u+1)));
}
else{
return max(getv(at),getvv(at,u));
}
}
int getans(int u,int v){
int an=getanss(u,v);
int k=up(v);
an=max(an,abs((a[k-1].x-a[u].x)/(a[k-1].t-v)));
an=max(an,abs((a[k].x-a[u].x)/(a[k].t-v)));
an=max(an,abs((a[u-1].x-a[u+1].x)/(a[u-1].t-a[u+1].t)));
return an;
}
int main(){
cin>>n>>m;
a[0].x=-1e9,a[0].t=-1;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].t;
a[i].lab=i;
}
n++;
a[n].x=0,a[n].t=1e7,a[n].lab=n;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
dy[a[i].lab]=i;
}
turn[++size]=1;
for(int i=2;i<n;i++){
if(a[i-1].x<=a[i].x&&a[i].x>=a[i+1].x||a[i-1].x>=a[i].x&&a[i].x<=a[i+1].x){
turn[++size]=i;
}
}
turn[++size]=n;
for(int i=2;i<=size;i++){
for(int j=turn[i-1]+1;j<=turn[i];j++){
int v=(a[j].x-a[j-1].x)/(a[j].t-a[j-1].t);
v=abs(v);
if(mxv[i]<=v)mxv2[i]=mxv[i],mxv[i]=v,locmx[i]=v;
else mxv2[i]=max(mxv2[i],v);
}
}
for(int i=1;i<=size;i++){
if(mxv[i]>=mx)mx2=mx,mx=mxv[i],lmx=i;
else mx2=max(mx2,mxv[i]);
if(mxv2[i]>=mx)mx2=mx,mx=mxv2[i],lmx=i;
else mx2=max(mx2,mxv2[i]);
}
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
if(a[dy[u]].t==v)cout<<mx<<endl;
else cout<<getans(dy[u],v)<<endl;
}
return 0;
}