为什么这份代码出现了如此鬼畜的错误?
https://www.luogu.com.cn/record/list?user=55201
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define M 1000000007
#define il inline
int n;
struct boom{
int num,r,st;
bool operator<(const boom ot)const{
return num<ot.num;
}
}a[1000005];
il int read()
{
int re=0;char ch=getchar();
while(ch>'9'||ch<'0'){ch=getchar();}
while(ch<='9'&&ch>='0'){re=re*10+ch-48;ch=getchar();}
return re;
}
struct ss{
int node,nxt;
}e[10000005];
int tree[20000005],tot,head[2000005],k,cnt,dfn[2000005],low[2000005],sz[2000005],mark[2000005],s[2000005],ls,aans[2000005],ll[2000005],rr[2000005];bool vis[2000005];
void tarjan(int x)
{
dfn[x]=low[x]=++k;
vis[x]=1;s[++ls]=x;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].node;
if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);}
else if(vis[y]){low[x]=min(low[x],low[y]);}
}
if(low[x]==dfn[x])
{
while(ls)
{
int now=s[ls];
mark[s[ls]]=x;
//sz[k]+=sz[s[ls]];
vis[s[ls]]=0;ls--;
if(x==now)break;
//ls--;
ll[x]=min(ll[x],ll[now]);
rr[x]=max(rr[x],rr[now]);
sz[x]+=sz[now];
//cerr<<x<<" "<<s[ls]<<endl;
}
}
}
void getans(int x)
{
// cerr<<x<< " ";
//have[x]=1;
// queue<int> q;
// for(int i=cnt+1;i<=(cnt<<1);++i)
// if(sz[i]&&!d[i])q.push(i);
// while(!q.empty())
// {
// int t=q.front();q.pop();
// for(int i=head[t];i;i=e[i].nxt)
// {
// int y=e[i].node;
// aans[y]+=aans[t];
// d[y]--;
// if(!d[y])q.push(y);
// }
// }
vis[x]=1;
// memset(ll,0x3f,sizeof(ll));
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].node;
if(!vis[y])getans(y);
ll[x]=min(ll[x],ll[y]);
rr[x]=max(rr[x],rr[y]);
}
}
void add(int u,int v)
{
e[++tot].nxt=head[u];
e[tot].node=v;
head[u]=tot;
}
void build(int l,int r,int k)
{
if(l==r)
{
tree[k]=l;
return;
}
int mid=(l+r)>>1;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
tree[k]=++cnt;
add(tree[k],tree[k<<1]);
add(tree[k],tree[k<<1|1]);
}
void update(int l,int r,int x,int y,int k,int v)
{
//cerr<<k<<" ";
if(x>a[r].num||y<a[l].num)return;
if(x<=a[l].num&&a[r].num<=y)
{
add(v,tree[k]);
return;
}
int mid=(l+r)>>1;
update(l,mid,x,y,k<<1,v);
update(mid+1,r,x,y,k<<1|1,v);
}
signed main()
{
n=read();
for(int i=1;i<=n;i++)
{
a[i].num=read();
a[i].r=read();
a[i].st=i;
sz[i]=1;
}
cnt=n;
sort(a+1,a+n+1);
build(1,n,1);
//cerr<<1;
memset(ll,0x3f,sizeof(ll));
for(int i=1;i<=n;i++)
{
update(1,n,a[i].num-a[i].r,a[i].num+a[i].r,1,i);ll[i]=rr[i]=i;
}
for(int i=1;i<=n;i++)
if(!dfn[i])tarjan(i);
int cnt2=cnt<<1;
int ans=0;//getans();
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(!vis[mark[i]])getans(i);
ans=(ans+a[i].st*(rr[mark[i]]-ll[mark[i]]+1))%M;
cerr<<ll[mark[i]]<<" "<<rr[mark[i]]<<" ";
}
cout<<ans;
}