結果

問題 No.2676 A Tourist
ユーザー NokonoKotlin
提出日時 2024-02-28 09:29:41
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
TLE  
実行時間 -
コード長 2,462 bytes
コンパイル時間 1,535 ms
コンパイル使用メモリ 158,484 KB
実行使用メモリ 15,268 KB
最終ジャッジ日時 2024-09-29 23:13:10
合計ジャッジ時間 9,889 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1 -- * 1
other TLE * 1 -- * 30
権限があれば一括ダウンロードができます

ソースコード

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