結果
問題 | No.3025 Chocol∀te |
ユーザー |
![]() |
提出日時 | 2025-02-15 08:17:00 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,947 ms / 2,000 ms |
コード長 | 2,508 bytes |
コンパイル時間 | 3,959 ms |
コンパイル使用メモリ | 298,840 KB |
実行使用メモリ | 35,264 KB |
最終ジャッジ日時 | 2025-02-15 08:18:47 |
合計ジャッジ時間 | 31,005 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 77 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;const int INF = 1e9 + 10;const ll INFL = 4e18;int main() {ios::sync_with_stdio(false), cin.tie(nullptr);int N, M;cin >> N >> M;vector<unordered_set<int>> G(N);for (int i = 0; i < M; i++) {int u, v;cin >> u >> v;u--, v--;G[u].insert(v), G[v].insert(u);}vector<ll> A(N);for (int i = 0; i < N; i++) cin >> A[i];vector<ll> sum(N);for (int i = 0; i < N; i++)for (int j : G[i]) sum[i] += A[j];int Q;cin >> Q;// const int B=sqrt(max(N,M)+Q);const int B = 450;vector<tuple<int, int, int>> qs(Q);vector<int> qv;qv.reserve(1000);for (int qb = 0; qb * B < Q; qb++) {int q = min(Q, (qb + 1) * B) - qb * B;qv.clear();for (int i = 0; i < q; i++) {int t;cin >> t;if (t == 1) {int u, v;cin >> u >> v;u--, v--;qs[qb * B + i] = {t, u, v};} else if (t == 2) {int p, a;cin >> p >> a;p--;qs[qb * B + i] = {t, p, a};} else {int c;cin >> c;c--;qs[qb * B + i] = {t, c, -1};qv.push_back(c);}}ranges::sort(qv);qv.erase(unique(qv.begin(), qv.end()), qv.end());for (int i = 0; i < q; i++) {int t = get<0>(qs[qb * B + i]);if (t == 1) {auto [t, u, v] = qs[qb * B + i];if (G[u].count(v)) {G[u].erase(v), G[v].erase(u);sum[u] -= A[v], sum[v] -= A[u];} else {G[u].insert(v), G[v].insert(u);sum[u] += A[v], sum[v] += A[u];}} else if (t == 2) {auto [t, p, a] = qs[qb * B + i];for (int v : qv) {if (G[p].count(v)) {sum[v] -= A[p];sum[v] += a;}}A[p] = a;} else {auto [t, c, _] = qs[qb * B + i];cout << sum[c] << '\n';}}for (int i = 0; i < N; i++) {sum[i] = 0;for (int j : G[i]) sum[i] += A[j];}}}