#include #include using namespace std; using namespace atcoder; using ll = long long; //using mint = modint998244353; int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); /* 差分を考える。 X_kが元々住んでいた家をZ_kとする。 (R-L+1) * A_k - [L, R]のレートの和だけ減少、 Z_kを地元として含むX_k以外の岩井の数*A_kだけ増加し、 引越し後は、 (V-U+1) * A_k - [U, V]のレートの和だけ増加、 と Y_kを地元として含むX_k以外の岩井の数*A_kだけ減少する。 だけ天才度の和が増加する。 range add point sumで家xを含む区間の数。 point add range sumで区間[U, V]内のレートの和を求める。 */ ll N, M, Q, ans=0; cin >> N >> M; vector A(N), L(N), R(N); fenwick_tree tc(M+1), ts(M+1); vector where(N); //iが住んでいる家の番号 for (int i=0; i> A[i] >> L[i] >> R[i]; L[i]--; R[i]--; tc.add(L[i], 1); tc.add(R[i]+1, -1); ts.add(i, A[i]); where[i] = i; } for (int i=0; i> Q; while(Q--){ ll X, Y, U, V, Z; cin >> X >> Y >> U >> V; X--; Y--; U--; V--; ans -= (R[X]-L[X]+1) * A[X] - ts.sum(L[X], R[X]+1); Z = where[X]; ans += (tc.sum(0, Z+1)-(L[X] <= Z && Z <= R[X])) * A[X]; where[X] = Y; ts.add(Z, -A[X]); ts.add(Y, A[X]); tc.add(L[X], -1); tc.add(R[X]+1, 1); L[X] = U; R[X] = V; tc.add(L[X], 1); tc.add(R[X]+1, -1); ans += (R[X]-L[X]+1) * A[X] - ts.sum(L[X], R[X]+1); ans -= (tc.sum(0, Y+1)-(L[X] <= Y && Y <= R[X])) * A[X]; cout << ans << '\n'; } return 0; }