#include <bits/stdc++.h>
using namespace std;
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define mp make_pair
#define pb emplace_back
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define re exit(0)
typedef long long ll;
typedef vector<int> vi;
const int mod = 666013;
const int maxn = 3005;
int n, m, a[maxn], idx[maxn];
vi g[maxn], val, topo;
bool vs[maxn];
/// --- Bitset tối ưu dùng uint64_t
struct Bitset64 {
static const int SZ = 48; // đủ cho 3005 bit
uint64_t bits[SZ];
Bitset64() { memset(bits, 0, sizeof(bits)); }
void set(int pos) {
int block = pos / 64;
int bit = pos % 64;
bits[block] |= (1ULL << bit);
}
void reset() {
memset(bits, 0, sizeof(bits));
}
Bitset64 operator|(const Bitset64 &other) const {
Bitset64 res;
for (int i = 0; i < SZ; i++)
res.bits[i] = bits[i] | other.bits[i];
return res;
}
Bitset64& operator|=(const Bitset64 &other) {
for (int i = 0; i < SZ; i++)
bits[i] |= other.bits[i];
return *this;
}
Bitset64 operator&(const Bitset64 &other) const {
Bitset64 res;
for (int i = 0; i < SZ; i++)
res.bits[i] = bits[i] & other.bits[i];
return res;
}
bool any() const {
for (int i = 0; i < SZ; i++)
if (bits[i]) return true;
return false;
}
int find_next(int pos) const {
int block = pos / 64;
int bit = pos % 64;
if (block >= SZ) return SZ * 64;
uint64_t cur = bits[block] & (~0ULL << bit);
if (cur != 0) {
return block * 64 + __builtin_ctzll(cur);
}
for (int i = block + 1; i < SZ; i++) {
if (bits[i]) return i * 64 + __builtin_ctzll(bits[i]);
}
return SZ * 64;
}
};
Bitset64 d[maxn], zero[maxn];
void dfs(int u) {
vs[u] = true;
for (int v : g[u]) {
if (!vs[v]) dfs(v);
}
topo.pb(u);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
ff(i, 1, n) {
cin >> a[i];
val.pb(a[i]);
}
// Nén giá trị độ cao
sort(all(val));
val.erase(unique(all(val)), val.end());
ff(i, 1, n) {
a[i] = (int)(upper_bound(all(val), a[i]) - val.begin()); // 1-based
idx[a[i]] = i;
}
// Đọc đồ thị
ff(i, 1, m) {
int u, v;
cin >> u >> v;
g[u].pb(v);
}
// Tôpô ngược
ff(i, 1, n) if (!vs[i]) dfs(i);
// Tạo zero[i] = bitset chứa các bit từ i..n
for (int i = n; i >= 1; i--) {
zero[i] = zero[i + 1];
zero[i].set(i);
}
// Duyệt topo ngược để xây d[u] = tập đỉnh reachable từ u
for (int u : topo) {
d[u].set(a[u]);
for (int v : g[u]) {
d[u] |= d[v];
}
}
ll ans = 0;
// Tính kết quả theo mô tả đề
ff(i, 1, n) ff(j, i + 1, n) {
Bitset64 tmp = d[i] & d[j];
if (!tmp.any()) {
ans = ans * (n + 1) % mod;
} else {
int l = max(a[i], a[j]);
int pos = tmp.find_next(l);
int found = (pos > n) ? 0 : idx[pos];
ans = (ans * (n + 1) + found) % mod;
}
}
cout << ans << nl;
re;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZmKGksIGEsIGIpIGZvcihhdXRvIGk9KGEpOyBpPD0oYik7ICsraSkKI2RlZmluZSBmZnIoaSwgYiwgYSkgZm9yKGF1dG8gaT0oYik7IGk+PShhKTsgLS1pKQojZGVmaW5lIG5sICJcbiIKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBzeihzKSAoaW50KXMuc2l6ZSgpCiNkZWZpbmUgYWxsKHMpIChzKS5iZWdpbigpLCAocykuZW5kKCkKI2RlZmluZSBtcyhhLHgpIG1lbXNldChhLCB4LCBzaXplb2YgKGEpKQojZGVmaW5lIHJlIGV4aXQoMCkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwoKY29uc3QgaW50IG1vZCA9IDY2NjAxMzsKY29uc3QgaW50IG1heG4gPSAzMDA1OwoKaW50IG4sIG0sIGFbbWF4bl0sIGlkeFttYXhuXTsKdmkgZ1ttYXhuXSwgdmFsLCB0b3BvOwpib29sIHZzW21heG5dOwoKLy8vIC0tLSBCaXRzZXQgdOG7kWkgxrB1IGTDuW5nIHVpbnQ2NF90CnN0cnVjdCBCaXRzZXQ2NCB7CiAgICBzdGF0aWMgY29uc3QgaW50IFNaID0gNDg7IC8vIMSR4bunIGNobyAzMDA1IGJpdAogICAgdWludDY0X3QgYml0c1tTWl07CgogICAgQml0c2V0NjQoKSB7IG1lbXNldChiaXRzLCAwLCBzaXplb2YoYml0cykpOyB9CgogICAgdm9pZCBzZXQoaW50IHBvcykgewogICAgICAgIGludCBibG9jayA9IHBvcyAvIDY0OwogICAgICAgIGludCBiaXQgPSBwb3MgJSA2NDsKICAgICAgICBiaXRzW2Jsb2NrXSB8PSAoMVVMTCA8PCBiaXQpOwogICAgfQoKICAgIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgbWVtc2V0KGJpdHMsIDAsIHNpemVvZihiaXRzKSk7CiAgICB9CgogICAgQml0c2V0NjQgb3BlcmF0b3J8KGNvbnN0IEJpdHNldDY0ICZvdGhlcikgY29uc3QgewogICAgICAgIEJpdHNldDY0IHJlczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNaOyBpKyspCiAgICAgICAgICAgIHJlcy5iaXRzW2ldID0gYml0c1tpXSB8IG90aGVyLmJpdHNbaV07CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBCaXRzZXQ2NCYgb3BlcmF0b3J8PShjb25zdCBCaXRzZXQ2NCAmb3RoZXIpIHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNaOyBpKyspCiAgICAgICAgICAgIGJpdHNbaV0gfD0gb3RoZXIuYml0c1tpXTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgQml0c2V0NjQgb3BlcmF0b3ImKGNvbnN0IEJpdHNldDY0ICZvdGhlcikgY29uc3QgewogICAgICAgIEJpdHNldDY0IHJlczsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNaOyBpKyspCiAgICAgICAgICAgIHJlcy5iaXRzW2ldID0gYml0c1tpXSAmIG90aGVyLmJpdHNbaV07CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICBib29sIGFueSgpIGNvbnN0IHsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNaOyBpKyspCiAgICAgICAgICAgIGlmIChiaXRzW2ldKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaW50IGZpbmRfbmV4dChpbnQgcG9zKSBjb25zdCB7CiAgICAgICAgaW50IGJsb2NrID0gcG9zIC8gNjQ7CiAgICAgICAgaW50IGJpdCA9IHBvcyAlIDY0OwoKICAgICAgICBpZiAoYmxvY2sgPj0gU1opIHJldHVybiBTWiAqIDY0OwoKICAgICAgICB1aW50NjRfdCBjdXIgPSBiaXRzW2Jsb2NrXSAmICh+MFVMTCA8PCBiaXQpOwogICAgICAgIGlmIChjdXIgIT0gMCkgewogICAgICAgICAgICByZXR1cm4gYmxvY2sgKiA2NCArIF9fYnVpbHRpbl9jdHpsbChjdXIpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IGJsb2NrICsgMTsgaSA8IFNaOyBpKyspIHsKICAgICAgICAgICAgaWYgKGJpdHNbaV0pIHJldHVybiBpICogNjQgKyBfX2J1aWx0aW5fY3R6bGwoYml0c1tpXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU1ogKiA2NDsKICAgIH0KfTsKCkJpdHNldDY0IGRbbWF4bl0sIHplcm9bbWF4bl07Cgp2b2lkIGRmcyhpbnQgdSkgewogICAgdnNbdV0gPSB0cnVlOwogICAgZm9yIChpbnQgdiA6IGdbdV0pIHsKICAgICAgICBpZiAoIXZzW3ZdKSBkZnModik7CiAgICB9CiAgICB0b3BvLnBiKHUpOwp9CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsgY291dC50aWUobnVsbHB0cik7CgogICAgY2luID4+IG4gPj4gbTsKICAgIGZmKGksIDEsIG4pIHsKICAgICAgICBjaW4gPj4gYVtpXTsKICAgICAgICB2YWwucGIoYVtpXSk7CiAgICB9CgogICAgLy8gTsOpbiBnacOhIHRy4buLIMSR4buZIGNhbwogICAgc29ydChhbGwodmFsKSk7CiAgICB2YWwuZXJhc2UodW5pcXVlKGFsbCh2YWwpKSwgdmFsLmVuZCgpKTsKICAgIGZmKGksIDEsIG4pIHsKICAgICAgICBhW2ldID0gKGludCkodXBwZXJfYm91bmQoYWxsKHZhbCksIGFbaV0pIC0gdmFsLmJlZ2luKCkpOyAvLyAxLWJhc2VkCiAgICAgICAgaWR4W2FbaV1dID0gaTsKICAgIH0KCiAgICAvLyDEkOG7jWMgxJHhu5MgdGjhu4sKICAgIGZmKGksIDEsIG0pIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGdbdV0ucGIodik7CiAgICB9CgogICAgLy8gVMO0cMO0IG5nxrDhu6NjCiAgICBmZihpLCAxLCBuKSBpZiAoIXZzW2ldKSBkZnMoaSk7CgogICAgLy8gVOG6oW8gemVyb1tpXSA9IGJpdHNldCBjaOG7qWEgY8OhYyBiaXQgdOG7qyBpLi5uCiAgICBmb3IgKGludCBpID0gbjsgaSA+PSAxOyBpLS0pIHsKICAgICAgICB6ZXJvW2ldID0gemVyb1tpICsgMV07CiAgICAgICAgemVyb1tpXS5zZXQoaSk7CiAgICB9CgogICAgLy8gRHV54buHdCB0b3BvIG5nxrDhu6NjIMSR4buDIHjDonkgZFt1XSA9IHThuq1wIMSR4buJbmggcmVhY2hhYmxlIHThu6sgdQogICAgZm9yIChpbnQgdSA6IHRvcG8pIHsKICAgICAgICBkW3VdLnNldChhW3VdKTsKICAgICAgICBmb3IgKGludCB2IDogZ1t1XSkgewogICAgICAgICAgICBkW3VdIHw9IGRbdl07CiAgICAgICAgfQogICAgfQoKICAgIGxsIGFucyA9IDA7CgogICAgLy8gVMOtbmgga+G6v3QgcXXhuqMgdGhlbyBtw7QgdOG6oyDEkeG7gQogICAgZmYoaSwgMSwgbikgZmYoaiwgaSArIDEsIG4pIHsKICAgICAgICBCaXRzZXQ2NCB0bXAgPSBkW2ldICYgZFtqXTsKCiAgICAgICAgaWYgKCF0bXAuYW55KCkpIHsKICAgICAgICAgICAgYW5zID0gYW5zICogKG4gKyAxKSAlIG1vZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpbnQgbCA9IG1heChhW2ldLCBhW2pdKTsKICAgICAgICAgICAgaW50IHBvcyA9IHRtcC5maW5kX25leHQobCk7CiAgICAgICAgICAgIGludCBmb3VuZCA9IChwb3MgPiBuKSA/IDAgOiBpZHhbcG9zXTsKICAgICAgICAgICAgYW5zID0gKGFucyAqIChuICsgMSkgKyBmb3VuZCkgJSBtb2Q7CiAgICAgICAgfQogICAgfQoKICAgIGNvdXQgPDwgYW5zIDw8IG5sOwogICAgcmU7Cn0K