Just store it in a binary segmented tree and use greedy algorithm technique. CODE: #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #define NMAX 300000 #define NN 100000 #define INF 1000000000LL using namespace std; typedef long long LL; struct N{//data to store in tree LL each,maxsub; //operation load.log update.,subtree statistic(calculate sub tree status in every update) N(){ each = 0; maxsub = -INF; } }; N st[NMAX]; void update2(int ni,int s,int e,int ps,int pe,LL v){ if(ps > pe)return; if(pe < s || ps > e)return; else if(ps <= s && pe >= e){//update all st[ni].each += v; } else{ int mid = (s+e)/2; update2(ni*2+1,s,mid,ps,min(mid,pe),v); update2(ni*2+2,mid+1,e,max(mid+1,ps),pe,v); LL sub1 = st[ni*2+1].each; LL sub2 = st[ni*2+2].each; if(mid>s)sub1 += st[ni*2+1].maxsub; if(mid+1 pe)return -INF; if(pe < s || ps > e)return -INF; else if(ps <= s && pe >= e){//get all segment if(s==e)return st[ni].each; else return st[ni].maxsub + st[ni].each; } else{ int mid = (s+e)/2; return max(query2(2*ni+1,s,mid,ps,min(pe,mid)),query2(2*ni+2,mid+1,e,max(ps,mid+1),pe))+st[ni].each; } } int main(){ for(LL i=0;i<=NN;i++){ update2(0,0,NN,i,i,-i); } int nn;scanf("%d",&nn); for(int i=0;i<nn;i++){ int a,b;scanf("%d%d",&a,&b); update2(0,0,NN,a,NN,b); LL ret = max(0LL,query2(0,0,NN,0,NN)); printf("%lld\n",ret); } return 0; }