#include using namespace std; int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); int N,Q; cin >> N >> Q; vector> P(N); vector> LRC(N); vector> Ls(N+1),Rs(N+1); for(int i=0; i> l >> r >> c,l--; for(int d=l; d vector { int n = r-l; vector dp(n+1); if(rev == false){ for(int i=0; i0; i--){ dp.at(i-1) = max(dp.at(i-1),dp.at(i)); for(auto pos : Rs.at(i+l)){ auto &[a,b,c] = LRC.at(pos); if(a >= l) dp.at(a-l) = max(dp.at(a-l),dp.at(i)+c); } } } return dp; }; vector answer(Q); auto f = [&](auto f,int l,int r,vector> Qs) -> void { if(Qs.size() == 0) return; if(l+1 == r){ long long big = 0; for(auto pos : Ls.at(l)){ auto [a,b,c] = LRC.at(pos); if(b == r) big = max(big,c); } for(auto [a,b,qpos] : Qs){ assert(a == l && b == r); answer.at(qpos) += big; } return; } int m = (l+r)/2; vector> Lq,Rq,Mq; for(auto [a,b,qpos] : Qs){ if(b <= m) Lq.push_back({a,b,qpos}); else if(a >= m) Rq.push_back({a,b,qpos}); else Mq.push_back({a,b,qpos}); } f(f,l,m,Lq),f(f,m,r,Rq); int n = Mq.size(); if(n == 0) return; vector best(n); for(auto pos : P.at(m)){ auto [a1,b1,c] = LRC.at(pos); if(!(l <= a1 && b1 <= r)) continue; auto dpl = DP(l,a1,true),dpr = DP(b1,r,false); for(int i=0; i> Query; auto DPL = DP(0,N,false),DPR = DP(0,N,true); for(int i=0; i> a >> b,a--,b--; auto [l1,r1,c1] = LRC.at(a); auto [l2,r2,c2] = LRC.at(b); if(max(l1,l2) < min(r1,r2)) answer.at(i) = -1; else{ answer.at(i) = c1+c2; answer.at(i) += DPL.at(min(l1,l2)); answer.at(i) += DPR.at(max(r1,r2)); if(max(l1,l2) != min(r1,r2)) Query.push_back({min(r1,r2),max(l1,l2),i}); } } f(f,0,N,Query); for(auto a : answer) cout << a << "\n"; }