不知道为什么TLE
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<iomanip>
#include<algorithm>
#include<cmath>
#include<vector>
#include<bitset>
#include<list>
#include<set>
#include<queue>
#include<map>
#include<stack>
#include<ctime>
#include<random>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll MAXN=1e6+2;
const ll inf=0x3f3f3f3f;
int n,d,c,scc,tot;
stack<int>sta;
pair<int,int>ind[MAXN];
vector<int>g[MAXN];
vector<int>g2[MAXN];
int dfn[MAXN],low[MAXN],belong[MAXN];
int cnt[MAXN],f[MAXN];
void initialize(int k){
scc=0;
tot=0;
while(sta.size()){
sta.pop();
}
for(int i=1;i<=k;i++){
g[i].clear();
g2[i].clear();
cnt[i]=0;
f[i]=0;
dfn[i]=0;
low[i]=0;
belong[i]=0;
}
return;
}
bool check(int start,int target){//从start能否跳到target
int sx=ind[start].first;
int sy=ind[start].second;
int ex=ind[target].first;
int ey=ind[target].second;
if(ey>sy+d){
return false;
}
int num=sy+d-ey;
int r=sx+num;
int l=sx-num;
if(ex>=l&&ex<=r){
return true;
}
return false;
}
void tarjan(int u){
dfn[u]=low[u]=++tot;
sta.push(u);
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(!belong[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
int v=0;
scc++;
while(v!=u){
v=sta.top();
sta.pop();
belong[v]=scc;
}
}
return;
}
void dfs(int u){
f[u]=cnt[u];
int num=0;
for(int i=0;i<g2[u].size();i++){
int v=g2[u][i];
dfs(v);
num=max(num,f[v]);
}
f[u]+=num;
return;
}
void solve(){
cin>>n>>d>>c;
initialize(n);
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
ind[i]=make_pair(x,y);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) continue;
if(check(i,j)){
g[i].push_back(j);
}
}
}
tarjan(c);
for(int u=1;u<=n;u++){
cnt[belong[u]]++;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(belong[u]!=belong[v]){
g2[belong[u]].push_back(belong[v]);
}
}
}
int s=belong[c];
dfs(s);
cout<<f[s]<<endl;
return;
}
int main(){
int T,tmp;
cin>>T>>tmp;
while(T--){
solve();
}
return 0;
}