#include <bits/stdc++.h>

using namespace std;

vector<int> E[100010];
vector<int> G[100010];

int w[100010];

int f[100010];
int s[100010];
int deg[100010];

int A[100010];

int get(int x)
{
	if (f[x] != x) f[x] = get(f[x]);
	return f[x];
}

void merge(int u, int v)
{
	int x = get(u), y = get(v);
	if (x != y) f[x] = y, s[y] += s[x];
}

int main()
{
	int n, m;
	while (scanf("%d", &n) != EOF) {
		for (int i = 1; i <= n; i++) {
			scanf("%d", w + i);
			E[i].clear();
			G[i].clear();
			f[i] = i, s[i] = 1, deg[i] = 0;
			A[i] = 0;
		}
		scanf("%d", &m);
		while (m--) {
			int u, v;
			scanf("%d%d", &u, &v);
			E[u].push_back(v);
			E[v].push_back(u);
			if (w[u] == w[v]) merge(u, v);
		}
		for (int u = 1; u <= n; u++) {
			sort(E[u].begin(), E[u].end(), [](int x, int y) {
				return w[x] < w[y];
				});
			for (int i = 1; i < E[u].size(); i++) {
				int x = E[u][i - 1], y = E[u][i];
				if (w[x] == w[y]) merge(x, y);
			}
		}
		for (int u = 1; u <= n; u++) {
			for (int v : E[u]) {
				int x = get(u), y = get(v);
				if (w[x] < w[y]) {
					G[x].push_back(y);
					deg[y]++;
				}
			}
			for (int i = 1; i < E[u].size(); i++) {
				int x = get(E[u][i - 1]), y = get(E[u][i]);
				if (w[x] < w[y]) {
					G[x].push_back(y);
					deg[y]++;
				}
			}
		}
		queue<int> Q;
		for (int u = 1; u <= n; u++) {
			if (get(u) == u && deg[u] == 0) {
				Q.push(u);
				A[u] = 1;
			}
		}
		long long ans = 0;
		while (!Q.empty()) {
			int u = Q.front();
			Q.pop();
			ans += (long long)A[u] * s[u];
			//printf("%d %d %d\n", u, A[u], s[u]);
			for (int v : G[u]) {
				A[v] = max(A[v], A[u] + 1);
				deg[v]--;
				if (deg[v] == 0) Q.push(v);
			}
		}
		//for (int i = 1; i <= n; i++) printf("%d ", A[i]); puts("");
		printf("%lld\n", ans);
	}
	return 0;
}

