結果
| 問題 |
No.3265 地元に帰れば天才扱い!
|
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2025-09-07 02:57:30 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 412 ms / 2,500 ms |
| コード長 | 2,690 bytes |
| コンパイル時間 | 2,714 ms |
| コンパイル使用メモリ | 207,984 KB |
| 実行使用メモリ | 15,540 KB |
| 最終ジャッジ日時 | 2025-09-07 02:57:47 |
| 合計ジャッジ時間 | 15,178 ms |
|
ジャッジサーバーID (参考情報) |
judge / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct FenwickTree {
int n;
vector<long long> data;
FenwickTree(int n_) {
n = n_ + 10;
data.assign(n + 1, 0);
}
void add(int p, long long x) {
assert(0 <= p && p < n);
p++;
while (p < (int)data.size()) {
data[p] += x;
p += p & -p;
}
}
long long sum(int p) {
// 区間 [0, p] の和
assert(0 <= p && p < n);
p++;
long long s = 0;
while (p > 0) {
s += data[p];
p -= p & -p;
}
return s;
}
long long rangesum(int l, int r) {
// 区間 [l, r] の和
assert(0 <= l && l <= r && r < n);
long long s = sum(r);
if (l > 0) s -= sum(l - 1);
return s;
}
};
struct RAQ {
FenwickTree a, b;
int n;
RAQ(int n_) : a(n_ + 10), b(n_ + 10) {
n = n_;
}
void add(int l, int r, long long x) {
// 区間 [l, r] に x を加算
assert(0 <= l && l <= r && r < n);
l++; r++;
a.add(l, -x * (l - 1));
b.add(l, x);
a.add(r + 1, x * r);
b.add(r + 1, -x);
}
long long sum(int l, int r) {
// 区間 [l, r] の和
assert(0 <= l && l <= r && r < n);
l++; r++;
long long res = a.sum(r) + b.sum(r) * r;
res -= a.sum(l - 1) + b.sum(l - 1) * (l - 1);
return res;
}
long long get(int p) {
return sum(p, p);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
FenwickTree ft(M);
RAQ raq(M);
vector<tuple<int,long long,int,int>> iwis; // {位置, A, L, R}
for (int i = 0; i < N; i++) {
long long A;
int L, R;
cin >> A >> L >> R;
L--; R--;
iwis.push_back({i, A, L, R});
ft.add(i, A);
raq.add(L, R, 1);
}
long long tot = 0;
for (auto &[p, a, l, r] : iwis) {
tot += a * (r - l + 1) - ft.rangesum(l, r);
}
int Q;
cin >> Q;
while (Q--) {
int X, Y, U, V;
cin >> X >> Y >> U >> V;
X--; Y--; U--; V--;
long long ntot = tot;
// 人 X を削除
auto [p, a, l, r] = iwis[X];
ntot -= a * (r - l + 1) - ft.rangesum(l, r);
raq.add(l, r, -1);
ntot += raq.get(p) * a;
ft.add(p, -a);
// 人 X を追加
ft.add(Y, a);
iwis[X] = {Y, a, U, V};
ntot += a * (V - U + 1) - ft.rangesum(U, V);
ntot -= raq.get(Y) * a;
raq.add(U, V, 1);
cout << ntot << "\n";
tot = ntot;
}
return 0;
}
norioc