开头const int maxn=1e6就100分,1e5就0分,不明白为啥啊
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<vector>
#include<string.h>
#define int long long
#define ll (o*2,L,m)
#define rr (o*2+1,m+1,R)
using namespace std;
const int maxn = 1e6 + 5;
const int INF = 1e9;
int pre[maxn * 2];
struct segment_tree
{
int addv[8 * maxn];
int sumv[8 * maxn];
int n; int y1, y2; int v; int* arr;
int _sum;
void dfs(int o, int L, int R)
{
if (L == R)
{
addv[o] = arr[L];
sumv[o] = arr[L]*(pre[L]-pre[L-1]);
return;
}
else
{
int m = L + (R - L) / 2;
dfs ll; dfs rr;
sumv[o] = sumv[o * 2] + sumv[o * 2 + 1];
}
}
void build(int n, int* a)
{
this->n = n; arr = a;
dfs(1, 1, n);
}
void maintain(int o, int L, int R)
{
sumv[o] = 0;
if (R > L)
{
sumv[o] = sumv[o * 2] + sumv[o * 2 + 1];
}
sumv[o] += addv[o] * (pre[R] - pre[L - 1]);
}
void pushdown(int o, int L, int R)
{
int m = L + (R - L) / 2;
addv[o * 2] += addv[o]; addv[o * 2 + 1] += addv[o];
addv[o] = 0;
}
void update(int o, int L, int R)
{
if (y1 <= L && R <= y2)
{
addv[o] += v;
}
else
{
int m = L + (R - L) / 2;
pushdown(o, L, R);
if (y1 <= m)update ll; else maintain ll;
if (y2 > m)update rr; else maintain rr;
}
maintain(o, L, R);
}
void query(int o, int L, int R)
{
if (y1 <= L && R <= y2)
{
_sum += sumv[o]; return;
}
else
{
int m = L + (R - L) / 2;
pushdown(o, L, R);
maintain ll; maintain rr;
if (y1 <= m)query ll;
if (y2 > m)query rr;
}
}
void interval_add(int a, int b, int v)
{
y1 = a; y2 = b; this->v = v;
update(1, 1, n);
}
int interval_sum(int a, int b)
{
_sum = 0; y1 = a; y2 = b;
query(1, 1, n);
return _sum;
}
}t;
int w[maxn];
vector<int> G[maxn];
int dfs_clock = 0;
int vis[maxn];
int arr[maxn][2];
int drr[maxn * 2];
void dfs(int u)
{
vis[u] = 1;
dfs_clock++;
drr[dfs_clock] = w[u];
pre[dfs_clock] = pre[dfs_clock - 1] + 1;
arr[u][0] = dfs_clock;
for (int i = 0; i < G[u].size(); i++)
{
int v = G[u][i];
if (!vis[v])dfs(v);
}
dfs_clock++;
drr[dfs_clock] = w[u];
pre[dfs_clock] = pre[dfs_clock - 1] - 1;
arr[u][1] = dfs_clock;
}
signed main()
{
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++)cin >> w[i];
for (int i = 0; i < n - 1; i++)
{
int u, v; cin >> u >> v;
G[u].push_back(v); G[v].push_back(u);
}
dfs(1);
t.build(2 * n, drr);
for (int i = 0; i < m; i++)
{
int op, x, a;
cin >> op >> x;
if (op == 1)
{
cin >> a;
if (arr[x][0] == 0 || arr[x][1] == 0)
{
int k = 1;
}
t.interval_add(arr[x][0], arr[x][0], a);
t.interval_add(arr[x][1], arr[x][1], a);
}
else if (op == 2)
{
cin >> a;
t.interval_add(arr[x][0], arr[x][1], a);
}
else
{
cout << t.interval_sum(1, arr[x][0]) << endl;
}
}
return 0;
}