#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include //#include //#include //#include //#include //#include //#include //#include //#include //#if __cplusplus >= 201103L //#include //#include //#include //#include // //#define cauto const auto& //#else //#endif using namespace std; typedef long long ll; typedef pair pii; typedef pair pll; typedef vector vint; typedef vector > vvint; typedef vector vll, vLL; typedef vector > vvll, vvLL; #define VV(T) vector > template void initvv(vector > &v, int a, int b, const T &t = T()){ v.assign(a, vector(b, t)); } template void convert(const F &f, T &t){ stringstream ss; ss << f; ss >> t; } #undef _P #define _P(...) (void)printf(__VA_ARGS__) #define reep(i,a,b) for(int i=(a);i<(b);++i) #define rep(i,n) reep((i),0,(n)) #define ALL(v) (v).begin(),(v).end() #define PB push_back #define F first #define S second #define mkp make_pair #define RALL(v) (v).rbegin(),(v).rend() #define DEBUG #ifdef DEBUG #define dump(x) cout << #x << " = " << (x) << endl; #define debug(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl; #else #define dump(x) #define debug(x) #endif #define MOD 1000000007LL #define EPS 1e-8 #define INF 0x3f3f3f3f #define INFL 0x3f3f3f3f3f3f3f3fLL #define maxs(x,y) x=max(x,y) #define mins(x,y) x=min(x,y) template class range_minimum_query{ public: std::vector data; std::vector > block; std::vector sblock; std::vector lookup; int N; int lg; int min(int a,int b){ return data[b] &t){ data=t; N=data.size(); lg=32-__builtin_clz(N); block.assign((N+lg-1)/lg,std::vector(lg,0)); for(int i=0;i st; for(int i=0;ir1*lg+lg?l:r1*lg+lg; ans=min(ans,lookup[sblock[t]&(~(((1<<(l-(r1*lg+lg)))-1)<<(r1*lg+(lg<<1)-l)))]+r1*lg+lg); return data[ans]; } }; vector v; ll K; int n; vll sum; vint nex; ll loss(int a, int b){ if(a>b) return 0; ll ret = sum[b]; if(a-1>=0) ret -= sum[a-1]; return ret; } ll calc(ll m, range_minimum_query &rmq){ vll dp(n+1,INFL); dp[0] = 0; rep(i,n){ if(v[i].S>m){ if(i+1>nex[i]-1 || -rmq.q(i+1, nex[i]-1) <= m) mins(dp[nex[i]], dp[i]+loss(i+1,nex[i]-1)); } else{ mins(dp[i+1], dp[i]+v[i].S); if(i+1>nex[i]-1 || -rmq.q(i+1, nex[i]-1) <= m) mins(dp[nex[i]], dp[i]+loss(i+1,nex[i]-1)); } } if(dp[n] == INFL){ return -1; } return dp[n]; } void mainmain(){ cin>>n; cin>>K; v=vector(n); sum = vll(n); nex = vint(n); vll tmp(n); rep(i,n) cin>>v[i].F>>v[i].S,tmp[i]=-v[i].S; range_minimum_query rmq(tmp); rep(i,n){ if(!i) sum[i] = v[i].S; else{ sum[i] = sum[i-1]+v[i].S; } } int p = 0; rep(i,n){ while(p1){ ll mid = (l+r)/2; ll t = calc(mid, rmq); if(t<0){ l = mid; } else{ r = mid; ans = t; } } cout<