結果

問題 No.2676 A Tourist
ユーザー NokonoKotlinNokonoKotlin
提出日時 2024-02-11 20:11:30
言語 C++23
(gcc 12.3.0 + boost 1.83.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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 TLE -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

// 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;
}
0