#include <bits/stdc++.h>
using namespace std;
 
#define int long long
 
#define all(x) (x).begin(), (x).end()
 
template<template<typename> class Container, typename G>
ostream& operator<<(ostream& os, Container<G> x) {
    int f = 0; os << '{'; for (auto &i: x) os << (f++ ? ", " : ""), os << i; os << "}";
    return os;
}
 
void _print() {cerr << "]\n";}
 
template<typename T, typename... V>
void _print(T t, V... v) {cerr << t; if (sizeof...(v)) cerr <<", "; _print(v...);}
 
#ifdef DEBUG
#define dbg(x...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<" [" << #x << "] = ["; _print(x); cerr << "\e[39m" << endl;
#else
#define dbg(x...)
#endif
#define pii pair<int, int>
#define f first
#define s second
vector<pii> val;
int root[2000005];
struct seg{
	struct node{
		int l,r,cnt,sum;
	} t[200005*30];
	int cnt=0;
	int make(int v,int l,int r,int n){// n is old node,v is index we are adding in
		if(r<v or v<l)return n;
		int cur=++cnt;
		t[cur]=t[n];
		if(l!=r){
			int mid=(l+r)>>1;
			t[cur].l=make(v,l,mid,t[n].l);
			t[cur].r=make(v,mid+1,r,t[n].r);
		}
		t[cur].cnt++;
		t[cur].sum+=val[v].f;
		return cur;
	}
	int query(int sum,int l,int r,int n1,int n2){
		if(l==r)return val[l].f*sum;
		int rcnt=t[t[n2].r].cnt-t[t[n1].r].cnt;
		int tot=t[t[n2].r].sum-t[t[n1].r].sum;
		int mid=(l+r)>>1;
		if(rcnt>sum)return query(sum,mid+1,r,t[n1].r,t[n2].r);
		else return tot+query(sum-rcnt,l,mid,t[n1].l,t[n2].l);
	}
} segtree;
int m,n,ans=-1e18;
vector<pii> a;
void solve(int s,int e,int l,int r){
	if(r<l)return;
	int mid=(l+r)>>1;
	int opt=e,best=-1e18;
	for(int i=max(s,mid+m-1);i<=e;i++){
		int val=segtree.query(m,1,n,root[mid-1],root[i])-2ll*(a[i].s-a[mid].s);
		if(val>=best){
			best=val;
			opt=i;
		}
	}
	ans=max(ans,best);
	solve(s,opt,l,mid-1);solve(opt,e,mid+1,r);
}
int32_t main() {
	cin>>n>>m;
	a.resize(n);
	for(int i=0;i<n;i++)cin>>a[i].f>>a[i].s;//val, minusthingy
	
	// inx in seg is coord compressed val
	sort(all(a));
	val=a;
	val.insert(val.begin(),make_pair(0,0));
	map<int,int> comp;
	for(int i=1;i<=n;i++){
		comp[val[i].f]=i;
	}
	sort(all(a),[&](pii a,pii b){
		if(a.s==b.s)return a.f<b.f;
		return a.s<b.s;
	});
	a.insert(a.begin(),make_pair(0,0));
	for(int i=1;i<=n;i++){
		root[i]=segtree.make(comp[a[i].f],1,n,root[i-1]);
	}
	solve(1,n,1,n);
	cout<<ans<<"\n";
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |