#include <algorithm>
#include <iostream>
#include <vector>

#define let auto
#define fn auto
#define usize size_t
using namespace std;

struct Node {
    usize acc;
    usize self;
    vector<Node *> *adjs;

    void add_route(Node *node) {
        adjs->push_back(node);
    }

    void update_delta(usize delta) {
        acc += delta;
        self += delta;
        for (let x: *adjs) {
            x->update_by_direct(delta);
        }
    }

    void update_by_direct(usize delta) {
        acc += delta;
    }
};

fn fastio() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

fn main() -> int {
    fastio();
    usize n, q;
    cin >> n >> q;
    let arr = (usize *) calloc(n, sizeof(usize));

    let graph = (Node **) calloc(n, sizeof(Node *));

    for (usize i = 0; i < n; i++) {
        graph[i] = (Node *) malloc(sizeof(Node));
        graph[i]->acc = 0;
        graph[i]->self = 0;
        graph[i]->adjs = new vector<Node *>();
    }

    for (usize i = 0; i < n; i++) {
        usize a;
        cin >> a;
        arr[i] = a;
    }

    for (usize i = 0; i < n - 1; i++) {
        usize u, v;
        cin >> u >> v;
        u = u - 1;
        v = v - 1;
        graph[u]->add_route(graph[v]);
        graph[v]->add_route(graph[u]);
    }

    for (usize i = 0; i < n; i++) {
        graph[i]->update_delta(arr[i]);
    }

    for (usize i = 0; i < q; i++) {
        usize inst;
        cin >> inst;

        if (inst == 1) {
            usize target, c;
            cin >> target >> c;
            target -= 1;
            graph[target]->update_delta(c);
        } else {
            usize target;
            cin >> target;
            target -= 1;
            cout << graph[target]->acc << '\n';
        }
    }
end:

    free(arr);
    for (usize i = 0; i < n; i++) {
        delete graph[i]->adjs;
        free(graph[i]);
    }
    free(graph);
}