#define _USE_MATH_DEFINES #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const int INF = INT_MAX / 4; vector a; vector > edges; map, int> memo; int solve(int curr, int prev, int prevValue) { if(memo.find(make_tuple(curr, prev, prevValue)) != memo.end()) return memo[make_tuple(curr, prev, prevValue)]; map maxValue; for(int next : edges[curr]){ if(next == prev || a[next] == prevValue || ((a[curr] < prevValue) ^ (a[curr] < a[next]))) continue; maxValue[a[next]] = max(maxValue[a[next]], solve(next, curr, a[curr])); } int ans; if(prevValue == INF || prevValue == -INF) ans = maxValue.size() * (maxValue.size() - 1) / 2; else ans = maxValue.size() * (maxValue.size() + 1) / 2; for(const auto& p : maxValue) ans += p.second; return memo[make_tuple(curr, prev, prevValue)] = ans; } int main() { int n; cin >> n; a.resize(n); for(int i=0; i> a[i]; edges.assign(n, vector()); for(int i=0; i> x >> y; -- x; -- y; edges[x].push_back(y); edges[y].push_back(x); } int ans = 0; for(int i=0; i