結果
| 問題 |
No.2676 A Tourist
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-11 20:11:30 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,461 bytes |
| コンパイル時間 | 1,928 ms |
| コンパイル使用メモリ | 158,344 KB |
| 実行使用メモリ | 13,568 KB |
| 最終ジャッジ日時 | 2024-09-29 23:07:54 |
| 合計ジャッジ時間 | 12,436 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 -- * 1 |
| other | TLE * 1 -- * 30 |
ソースコード
// include
//------------------------------------------
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
const long long INF = 4e18;
const long long NINF = 1 - INF;
int N;
vector<long long> a; // [u] := 頂点 u の価値
vector<vector<int> > G; // 隣接リスト
int main() {
int Q;
cin >> N >> Q;
G.resize(N);
a.resize(N);
for (long long &x : a) cin >> x;
for (int i = 0; i < N - 1; i++) {
int u, v;
cin >> u >> v;
u--;
v--;
G[u].push_back(v);
G[v].push_back(u);
}
int query_times = 0; // カウンター(何回目のbfsの結果かを担当する)
vector<pair<int, int> > visited(N + 1, make_pair(-1, -1)); // second は前の頂点
vector<int> on_catapilar_path(N + 1, -1); // [x]:= query_times なら、頂点 x がそのクエリでの毛虫パス上に含まれる
while (Q-- > 0) {
long long t, u, v;
cin >> t >> u >> v;
query_times++;
if (t == 0) {
u--;
a[u] += v;
} else {
u--;
v--;
queue<int> q;
q.push(u);
visited[u] = {query_times, -1};
while (!q.empty()) {
int now = q.front();
q.pop();
for (int nx : G[now]) {
if (visited[nx].first == query_times) continue;
q.push(nx);
visited[nx] = {query_times, now};
}
}
int now = v;
while (true) {
on_catapilar_path[now] = query_times;
for (int nx : G[now]) on_catapilar_path[nx] = query_times;
if (now == u) break;
now = visited[now].second;
}
long long res = 0;
for (int x = 0; x <= N; x++)
if (on_catapilar_path[x] == query_times) res += a[x];
cout << res << endl;
}
}
return 0;
}