rt,没找到哪里有锅。救一下吧 qwq。
#include <bits/stdc++.h>
#define lint __int128
#define int long long
#define fi first
#define se second
#define Il inline
#define Rg register
#define Ri Rg int
#define pb push_back
#define vec vector
#define IT ::iterator
#define p_que priority_queue
using namespace std;
//typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
const int N=2e5,Inf=1e18;
const db eps=1e-9,pi=acos(-1.0);
int n,m,rt[N+5],dp[N+5],ans=-Inf;
int lsh[N+5],dn=0;
int si=0,sm[N*20+5],ss[N*20+5],ls[N*20+5],rs[N*20+5];
pii a[N+5];
Il void Disc(){
for(Ri i=1;i<=n;i++)lsh[i]=a[i].se;
sort(lsh+1,lsh+n+1);dn=unique(lsh+1,lsh+n+1)-lsh-1;
for(Ri i=1;i<=n;i++)a[i].se=lower_bound(lsh+1,lsh+dn+1,a[i].se)-lsh;
return;
}
Il int add(int ps,int l,int r,int fp){
int p=++si;sm[p]=lsh[ps],ss[p]=1;ls[p]=ls[fp],rs[p]=rs[fp];
if(l==r)return p;int mid=(l+r)>>1;
if(ps<=mid)ls[p]=add(ps,l,mid,ls[fp]);
else rs[p]=add(ps,mid+1,r,rs[fp]);
sm[p]=sm[ls[p]]+sm[rs[p]],ss[p]=ss[ls[p]]+ss[rs[p]];
return p;
}
Il int qsm(int pl,int pr,int l,int r,int K){
if(ss[pr]-ss[pl]<=K)return sm[pr]-sm[pl];
if(l==r)return K*lsh[l];int mid=(l+r)>>1;
if(ss[rs[pr]]-ss[rs[pl]]>=K)return qsm(rs[pl],rs[pr],mid+1,r,K);
return qsm(ls[pl],ls[pr],l,mid,K-(ss[rs[pr]]-ss[rs[pl]]))+sm[rs[pr]]-sm[rs[pl]];
}
Il void solve(int l,int r,int pl,int pr){
if(l>r||pl>pr)return;int mid=(l+r)>>1,p=pl;dp[mid]=-Inf;
for(Ri i=pl;i<=min(pr,mid-m+1);i++){
int tm=qsm(rt[i-1],rt[mid],1,dn,m)+(a[i].fi<<1)-(a[mid].fi<<1);
if(tm>=dp[mid])dp[mid]=tm,p=i;
}
solve(l,mid-1,pl,p),solve(mid+1,r,p,pr);
return;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;for(Ri i=1;i<=n;i++)cin>>a[i].se>>a[i].fi;
sort(a+1,a+n+1);Disc();
for(Ri i=1;i<=n;i++)rt[i]=add(a[i].se,1,dn,rt[i-1]);
solve(1,n,1,n);
for(Ri i=1;i<=n;i++)ans=max(ans,dp[i]);
cout<<ans;
return 0;
}