C++ 神犇们帮我看看代码为什么WA

报错信息
91 Wrong Answer

状态 耗时 内存占用

#1 Wrong Answer 14ms 15.6 MiB
#1 Accepted 15ms 15.7 MiB
#2 Accepted 14ms 15.6 MiB
#3 Accepted 15ms 15.7 MiB
#4 Accepted 16ms 15.7 MiB
#5 Accepted 15ms 15.6 MiB
#6 Accepted 67ms 17.2 MiB
#7 Accepted 64ms 17.1 MiB
#8 Accepted 68ms 17.2 MiB
#9 Accepted 274ms 23.1 MiB
#10 Accepted 245ms 22.6 MiB

问题描述
在一条直线上有 NN 个炸弹,每个炸弹的坐标是 X_iX 
i
​
 ,爆炸半径是 R_iR 
i
​
 ,当一个炸弹爆炸时,如果另一个炸弹所在位置 X_jX 
j
​
  满足:

X_i-R_i\leq X_j \leq X_i+R_i
X 
i
​
 −R 
i
​
 ≤X 
j
​
 ≤X 
i
​
 +R 
i
​
 

那么,该炸弹也会被引爆。

现在,请你帮忙计算一下,先把第 ii 个炸弹引爆,将引爆多少个炸弹呢?

输入
第一行,一个数字 NN,表示炸弹个数。

第 2\sim N+12∼N+1 行,每行 22 个数字,表示 X_iX 
i
​
 ,R_iR 
i
​
 ,保证 X_iX 
i
​
  严格递增。

输出
一个数字,表示 \sum \limits_{i=1}^n i\times 
i=1
∑
n
​
 i× 炸弹 ii 能引爆的炸弹个数 \mod 10^9+7mod10 
9
 +7。

样例
输入数据 1
4
1 1
5 1
6 5
15 15
输出数据 1
32

我的代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6+10;
ll a[maxn], b[maxn], c[maxn], d[maxn];
int main(){
    ll n, sum = 0;
//    memset(a, 0, sizeof(a));
//    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    memset(d, 0, sizeof(d));
    scanf("%lld", &n);
    for(ll i = 1; i <= n; i++){
        scanf("%lld %lld", &a[i], &b[i]); 
        c[i] = d[i] = i;
    }
    for(ll i = 1; i <= n; i++){
        while(c[i] > 1 && a[i] - a[c[i]-1] <= b[i]){
             c[i] = c[c[i]-1];
            b[i] = max(b[i], b[c[i]] - (a[i] - a[c[i]]));
        }
    } 
    for(ll i = n; i >= 1; i--){
        while(d[i] < n && a[d[i]+1] - a[i] <= b[i]){
            d[i] = d[d[i]+1];
            c[i] = min(c[i], c[d[i]]);
        }
    }
    for(ll i = 1; i <= n ; i++){
        sum = (sum + i * (d[i] - c[i] + 1)) % 1000000007;
    }
    printf("%lld", sum);
}

for嵌套太多层了