#include <bits/stdc++.h>
using namespace std;
const int N=5e5;
int n;
int l[N];
int r[N];
int dp[N];
int fw[N];
vector<int> g[N];
void update(int pos){
    for(;pos<N;pos+=(pos&-pos)){
        fw[pos]++;
    }
}
int get(int pos){
    int answ=0ll;
    for(;pos>0;pos-=(pos&-pos)){
        answ+=fw[pos];
    }
    return answ;
}
int get(int l,int r){
    return get(r)-get(l-1);
}
int main()
{
    cin>>n;
    set<int> st;
    for(int i=1;i<=n;++i){
        cin>>l[i]>>r[i];
    }
    for(int i=1;i<=n;++i){
        for(auto j:g[i]){
            update(j);
        }
        int x=0;
        int L=1;
        int R=i-l[i]-1;
        while(L<=R){
            int mid=(L+R)/2;
            if(get(mid,i-l[i]-1)){
                x=mid;
                L=mid+1;
            }
            else{
                R=mid-1;
            }
        }
        dp[i]=max(dp[i-1],dp[x]+1);
        g[i+r[i]+1].push_back(i);
    }
    cout<<dp[n];
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |