// Đạt đz s1 tg
#include <bits/stdc++.h>
#define f first
#define s second
#define mod 1000000007
#define PB push_back
#define PF push_front
#define inf 10000007
#define round(m,n) setprecision((int)m) << fixed << double(n)
#define ll long long
#define int long long
#define bit(x, i) ((x >> i) & 1)
#define pii pair<int, int>
#define TASK "B"
using namespace std;
void ADD(int &x, int y){
x += y;
if (x >= mod) x -= mod;
if (x < 0) x += mod;
}
int n, m;
int a[100005];
vector<int> adj[100005], ao[100005];
int vis[100005], f[100005], gay[100005];
pii edge[100005];
int ShortestPass(int st){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++)
f[i] = mod;
f[st] = a[st];
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push({a[st], st});
while(q.size()){
int u = q.top().s;
int w = q.top().f;
q.pop();
vis[u] = 1;
for(int v : adj[u])
if(!vis[v] && f[v] > w + a[v]){
f[v] = w + a[v];
q.push({f[v], v});
}
}
return f[n];
}
int cnt = 0, scc = 0, low[100005], num[100005], inst[100005];
vector<vector<int>> G;
stack<int> st;
void Tarjan(int u){
num[u] = low[u] = ++cnt;
st.push(u);
inst[u] = true;
for(int v : adj[u]){
if(num[v] == 0){
Tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(inst[v]){
low[u] = min(low[u], num[v]);
}
}
if(low[u] == num[u]){
vector<int> s;
int v = mod;
while(v != u){
v = st.top();
st.pop();
inst[v] = false;
s.PB(v);
}
G.PB(s);
++scc;
}
}
int save[100005];
int NoLeSieuGay(int st){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++)
f[i] = 0;
f[st] = gay[st];
priority_queue<pii> q;
q.push({gay[st], st});
while(q.size()){
int u = q.top().s;
int w = q.top().f;
q.pop();
vis[u] = 1;
for(int v : ao[u])
if(!vis[v] && f[v] < w + gay[v]){
f[v] = w + gay[v];
q.push({f[v], v});
}
}
return f[save[n]];
}
int Longlong(){
for(int i = 1; i <= n; i++)
if(num[i] == 0) Tarjan(i);
int ans = 0, cur = 0;
for(int i = 0; i < scc; i++){
int sum = 0;
for(auto v : G[i]){
save[v] = i;
gay[i] += a[v];
}
}
for(int i = 1; i <= m; i++){
ao[save[edge[i].f]].PB(save[edge[i].s]);
}
return NoLeSieuGay(save[1]);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if(fopen(TASK".INP", "r")){
freopen(TASK".INP", "r", stdin);
freopen(TASK".OUT", "w", stdout);
}
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= m; i++){
int u, v;
cin >> u >> v;
adj[u].PB(v);
edge[i] = {u, v};
}
pii Ans = make_pair(ShortestPass(1), Longlong());
if(Ans.f >= mod){
cout << -1;
return 0;
}
else cout << Ans.f << " " << Ans.s;
}
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10;
int n, m;
int a[N];
vector<int> adj[N], radj[N], adj2[N];
pair<int, int> edges[N];
int comp[N], vis[N], scc = 0;
int cw[N], indeg[N], dp[N];
vector<int> order;
void owo() {
vector<int> dist(n + 1, INF);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
dist[1] = a[1];
pq.emplace(dist[1], 1);
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (int v : adj[u]) {
if (dist[v] > dist[u] + a[v]) {
dist[v] = dist[u] + a[v];
pq.emplace(dist[v], v);
}
}
}
cout << (dist[n] == INF ? -1 : dist[n]) << '\n';
}
void dfs1(int u) {
vis[u] = true;
for (int v : adj[u])
if (!vis[v]) dfs1(v);
order.push_back(u);
}
void dfs2(int u) {
comp[u] = scc;
for (int v : radj[u])
if (comp[v] == -1) dfs2(v);
}
void uwu() {
memset(comp, -1, sizeof comp);
memset(dp, -0x3f, sizeof dp);
for (int i = 1; i <= n; i++)
if (!vis[i]) dfs1(i);
for (int i = (int)order.size() - 1; i >= 0; i--)
if (comp[order[i]] == -1)
dfs2(order[i]), ++scc;
for (int i = 1; i <= n; i++)
cw[comp[i]] += a[i];
for (int i = 0; i < m; i++) {
auto [u, v] = edges[i];
if (comp[u] != comp[v]) {
adj2[comp[u]].push_back(comp[v]);
++indeg[comp[v]];
}
}
int s = comp[1], t = comp[n];
dp[s] = cw[s];
queue<int> q;
for (int i = 0; i < scc; i++)
if (indeg[i] == 0) q.push(i);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : adj2[u]) {
if (dp[u] > -INF)
dp[v] = max(dp[v], dp[u] + cw[v]);
if (--indeg[v] == 0)
q.push(v);
}
}
cout << (dp[t] < 0 ? -1 : dp[t]) << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
radj[v].push_back(u);
edges[i] = {u, v};
}
vector<bool> mark(n + 1, false);
mark[1] = true;
queue<int> q;
q.push(1);
while (!q.empty()) {
int u = q.front(); q.pop();
for (int v : adj[u])
if (!mark[v]) {
mark[v] = true;
q.push(v);
}
}
if (!mark[n]) {
cout << "-1\n";
return 0;
}
owo();
uwu();
return 0;
}
#include <bits/stdc++.h>
#define For(i,x,n) for(int (i)=(int)(x);(i)<=(int)(n);(i)++)
#define int long long
#define down "\n"
using namespace std;
// Hàm tạo số ngẫu nhiên trong khoảng [L, R]
int UID(int L, int R) {
static mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
return uniform_int_distribution<int>(L, R)(rng);
}
signed main()
{
int N = UID(2, 100000);
int M = UID(N-1, min(100000, N * 10)); // Ensure at least a path is possible, but not too dense
cout << N << " " << M << '\n';
// Importance values a[i]
for (int i = 0; i < N; ++i) {
cout << UID(1, 1000) << " ";
}
cout << '\n';
set<pair<int, int>> edges;
// Ensure at least a path from 1 to N exists
for (int i = 1; i < N; ++i) {
int u = i;
int v = i + 1;
edges.insert({u, v});
cout << u << " " << v << '\n';
}
// Add remaining random edges
while ((int)edges.size() < M) {
int u = UID(1, N);
int v = UID(1, N);
if (u != v && !edges.count({u, v})) {
edges.insert({u, v});
cout << u << " " << v << '\n';
}
}
return 0;
}
Ly8gxJDhuqF0IMSReiBzMSB0ZwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAojZGVmaW5lIG1vZCAxMDAwMDAwMDA3CiNkZWZpbmUgUEIgcHVzaF9iYWNrCiNkZWZpbmUgUEYgcHVzaF9mcm9udAojZGVmaW5lIGluZiAxMDAwMDAwNwojZGVmaW5lIHJvdW5kKG0sbikgc2V0cHJlY2lzaW9uKChpbnQpbSkgPDwgZml4ZWQgPDwgZG91YmxlKG4pCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGJpdCh4LCBpKSAoKHggPj4gaSkgJiAxKQojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIFRBU0sgIkIiCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBBREQoaW50ICZ4LCBpbnQgeSl7CiAgICB4ICs9IHk7CiAgICBpZiAoeCA+PSBtb2QpIHggLT0gbW9kOwogICAgaWYgKHggPCAwKSB4ICs9IG1vZDsKfQoKaW50IG4sIG07CmludCBhWzEwMDAwNV07CnZlY3RvcjxpbnQ+IGFkalsxMDAwMDVdLCBhb1sxMDAwMDVdOwppbnQgdmlzWzEwMDAwNV0sIGZbMTAwMDA1XSwgZ2F5WzEwMDAwNV07CnBpaSBlZGdlWzEwMDAwNV07CgppbnQgU2hvcnRlc3RQYXNzKGludCBzdCl7CiAgICBtZW1zZXQodmlzLCAwLCBzaXplb2YodmlzKSk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBmW2ldID0gbW9kOwogICAgZltzdF0gPSBhW3N0XTsKICAgIHByaW9yaXR5X3F1ZXVlPHBpaSwgdmVjdG9yPHBpaT4sIGdyZWF0ZXI8cGlpPj4gcTsKICAgIHEucHVzaCh7YVtzdF0sIHN0fSk7CiAgICB3aGlsZShxLnNpemUoKSl7CiAgICAgICAgaW50IHUgPSBxLnRvcCgpLnM7CiAgICAgICAgaW50IHcgPSBxLnRvcCgpLmY7CiAgICAgICAgcS5wb3AoKTsKICAgICAgICB2aXNbdV0gPSAxOwogICAgICAgIGZvcihpbnQgdiA6IGFkalt1XSkKICAgICAgICBpZighdmlzW3ZdICYmIGZbdl0gPiB3ICsgYVt2XSl7CiAgICAgICAgICAgIGZbdl0gPSB3ICsgYVt2XTsKICAgICAgICAgICAgcS5wdXNoKHtmW3ZdLCB2fSk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBmW25dOwp9CgppbnQgY250ID0gMCwgc2NjID0gMCwgbG93WzEwMDAwNV0sIG51bVsxMDAwMDVdLCBpbnN0WzEwMDAwNV07CnZlY3Rvcjx2ZWN0b3I8aW50Pj4gRzsKc3RhY2s8aW50PiBzdDsKCnZvaWQgVGFyamFuKGludCB1KXsKICAgIG51bVt1XSA9IGxvd1t1XSA9ICsrY250OwogICAgc3QucHVzaCh1KTsKICAgIGluc3RbdV0gPSB0cnVlOwoKICAgIGZvcihpbnQgdiA6IGFkalt1XSl7CiAgICAgICAgaWYobnVtW3ZdID09IDApewogICAgICAgICAgICBUYXJqYW4odik7CiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIGxvd1t2XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoaW5zdFt2XSl7CiAgICAgICAgICAgIGxvd1t1XSA9IG1pbihsb3dbdV0sIG51bVt2XSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmKGxvd1t1XSA9PSBudW1bdV0pewogICAgICAgIHZlY3RvcjxpbnQ+IHM7CiAgICAgICAgaW50IHYgPSBtb2Q7CiAgICAgICAgd2hpbGUodiAhPSB1KXsKICAgICAgICAgICAgdiA9IHN0LnRvcCgpOwogICAgICAgICAgICBzdC5wb3AoKTsKICAgICAgICAgICAgaW5zdFt2XSA9IGZhbHNlOwogICAgICAgICAgICBzLlBCKHYpOwogICAgICAgIH0KICAgICAgICBHLlBCKHMpOwogICAgICAgICsrc2NjOwogICAgfQp9CgppbnQgc2F2ZVsxMDAwMDVdOwoKaW50IE5vTGVTaWV1R2F5KGludCBzdCl7CiAgICBtZW1zZXQodmlzLCAwLCBzaXplb2YodmlzKSk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBmW2ldID0gMDsKICAgIGZbc3RdID0gZ2F5W3N0XTsKICAgIHByaW9yaXR5X3F1ZXVlPHBpaT4gcTsKICAgIHEucHVzaCh7Z2F5W3N0XSwgc3R9KTsKICAgIHdoaWxlKHEuc2l6ZSgpKXsKICAgICAgICBpbnQgdSA9IHEudG9wKCkuczsKICAgICAgICBpbnQgdyA9IHEudG9wKCkuZjsKICAgICAgICBxLnBvcCgpOwogICAgICAgIHZpc1t1XSA9IDE7CiAgICAgICAgZm9yKGludCB2IDogYW9bdV0pCiAgICAgICAgaWYoIXZpc1t2XSAmJiBmW3ZdIDwgdyArIGdheVt2XSl7CiAgICAgICAgICAgIGZbdl0gPSB3ICsgZ2F5W3ZdOwogICAgICAgICAgICBxLnB1c2goe2Zbdl0sIHZ9KTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZbc2F2ZVtuXV07Cn0KCmludCBMb25nbG9uZygpewogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgaWYobnVtW2ldID09IDApIFRhcmphbihpKTsKCiAgICBpbnQgYW5zID0gMCwgY3VyID0gMDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzY2M7IGkrKyl7CiAgICAgICAgaW50IHN1bSA9IDA7CiAgICAgICAgZm9yKGF1dG8gdiA6IEdbaV0pewogICAgICAgICAgICBzYXZlW3ZdID0gaTsKICAgICAgICAgICAgZ2F5W2ldICs9IGFbdl07CiAgICAgICAgfQogICAgfQoKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKXsKICAgICAgICBhb1tzYXZlW2VkZ2VbaV0uZl1dLlBCKHNhdmVbZWRnZVtpXS5zXSk7CiAgICB9CgogICAgcmV0dXJuIE5vTGVTaWV1R2F5KHNhdmVbMV0pOwp9CgpzaWduZWQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwoKICAgIGlmKGZvcGVuKFRBU0siLklOUCIsICJyIikpewogICAgICAgIGZyZW9wZW4oVEFTSyIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihUQVNLIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgY2luID4+IG4gPj4gbTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIGNpbiA+PiBhW2ldOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKXsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFkalt1XS5QQih2KTsKICAgICAgICBlZGdlW2ldID0ge3UsIHZ9OwogICAgfQoKICAgIHBpaSBBbnMgPSBtYWtlX3BhaXIoU2hvcnRlc3RQYXNzKDEpLCBMb25nbG9uZygpKTsKICAgIGlmKEFucy5mID49IG1vZCl7CiAgICAgICAgY291dCA8PCAtMTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGVsc2UgY291dCA8PCBBbnMuZiA8PCAiICIgPDwgQW5zLnM7Cn0KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IElORiA9IDB4M2YzZjNmM2YzZjNmM2YzZjsKY29uc3QgaW50IE4gPSAxZTUgKyAxMDsKCmludCBuLCBtOwppbnQgYVtOXTsKdmVjdG9yPGludD4gYWRqW05dLCByYWRqW05dLCBhZGoyW05dOwpwYWlyPGludCwgaW50PiBlZGdlc1tOXTsKCmludCBjb21wW05dLCB2aXNbTl0sIHNjYyA9IDA7CmludCBjd1tOXSwgaW5kZWdbTl0sIGRwW05dOwp2ZWN0b3I8aW50PiBvcmRlcjsKCnZvaWQgb3dvKCkgewogICAgdmVjdG9yPGludD4gZGlzdChuICsgMSwgSU5GKTsKICAgIHByaW9yaXR5X3F1ZXVlPHBhaXI8aW50LCBpbnQ+LCB2ZWN0b3I8cGFpcjxpbnQsIGludD4+LCBncmVhdGVyPD4+IHBxOwogICAgZGlzdFsxXSA9IGFbMV07CiAgICBwcS5lbXBsYWNlKGRpc3RbMV0sIDEpOwogICAgd2hpbGUgKCFwcS5lbXB0eSgpKSB7CiAgICAgICAgYXV0byBbZCwgdV0gPSBwcS50b3AoKTsgcHEucG9wKCk7CiAgICAgICAgaWYgKGQgPiBkaXN0W3VdKSBjb250aW51ZTsKICAgICAgICBmb3IgKGludCB2IDogYWRqW3VdKSB7CiAgICAgICAgICAgIGlmIChkaXN0W3ZdID4gZGlzdFt1XSArIGFbdl0pIHsKICAgICAgICAgICAgICAgIGRpc3Rbdl0gPSBkaXN0W3VdICsgYVt2XTsKICAgICAgICAgICAgICAgIHBxLmVtcGxhY2UoZGlzdFt2XSwgdik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjb3V0IDw8IChkaXN0W25dID09IElORiA/IC0xIDogZGlzdFtuXSkgPDwgJ1xuJzsKfQoKdm9pZCBkZnMxKGludCB1KSB7CiAgICB2aXNbdV0gPSB0cnVlOwogICAgZm9yIChpbnQgdiA6IGFkalt1XSkKICAgICAgICBpZiAoIXZpc1t2XSkgZGZzMSh2KTsKICAgIG9yZGVyLnB1c2hfYmFjayh1KTsKfQoKdm9pZCBkZnMyKGludCB1KSB7CiAgICBjb21wW3VdID0gc2NjOwogICAgZm9yIChpbnQgdiA6IHJhZGpbdV0pCiAgICAgICAgaWYgKGNvbXBbdl0gPT0gLTEpIGRmczIodik7Cn0KCnZvaWQgdXd1KCkgewogICAgbWVtc2V0KGNvbXAsIC0xLCBzaXplb2YgY29tcCk7CiAgICBtZW1zZXQoZHAsIC0weDNmLCBzaXplb2YgZHApOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBpZiAoIXZpc1tpXSkgZGZzMShpKTsKICAgIGZvciAoaW50IGkgPSAoaW50KW9yZGVyLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgIGlmIChjb21wW29yZGVyW2ldXSA9PSAtMSkKICAgICAgICAgICAgZGZzMihvcmRlcltpXSksICsrc2NjOwoKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBjd1tjb21wW2ldXSArPSBhW2ldOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgICAgYXV0byBbdSwgdl0gPSBlZGdlc1tpXTsKICAgICAgICBpZiAoY29tcFt1XSAhPSBjb21wW3ZdKSB7CiAgICAgICAgICAgIGFkajJbY29tcFt1XV0ucHVzaF9iYWNrKGNvbXBbdl0pOwogICAgICAgICAgICArK2luZGVnW2NvbXBbdl1dOwogICAgICAgIH0KICAgIH0KCiAgICBpbnQgcyA9IGNvbXBbMV0sIHQgPSBjb21wW25dOwogICAgZHBbc10gPSBjd1tzXTsKCiAgICBxdWV1ZTxpbnQ+IHE7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHNjYzsgaSsrKQogICAgICAgIGlmIChpbmRlZ1tpXSA9PSAwKSBxLnB1c2goaSk7CgogICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICBpbnQgdSA9IHEuZnJvbnQoKTsgcS5wb3AoKTsKICAgICAgICBmb3IgKGludCB2IDogYWRqMlt1XSkgewogICAgICAgICAgICBpZiAoZHBbdV0gPiAtSU5GKQogICAgICAgICAgICAgICAgZHBbdl0gPSBtYXgoZHBbdl0sIGRwW3VdICsgY3dbdl0pOwogICAgICAgICAgICBpZiAoLS1pbmRlZ1t2XSA9PSAwKQogICAgICAgICAgICAgICAgcS5wdXNoKHYpOwogICAgICAgIH0KICAgIH0KCiAgICBjb3V0IDw8IChkcFt0XSA8IDAgPyAtMSA6IGRwW3RdKSA8PCAnXG4nOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgY2luID4+IGFbaV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIGludCB1LCB2OwogICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICByYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgICAgICBlZGdlc1tpXSA9IHt1LCB2fTsKICAgIH0KCiAgICB2ZWN0b3I8Ym9vbD4gbWFyayhuICsgMSwgZmFsc2UpOwogICAgbWFya1sxXSA9IHRydWU7CiAgICBxdWV1ZTxpbnQ+IHE7CiAgICBxLnB1c2goMSk7CiAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgIGludCB1ID0gcS5mcm9udCgpOyBxLnBvcCgpOwogICAgICAgIGZvciAoaW50IHYgOiBhZGpbdV0pCiAgICAgICAgICAgIGlmICghbWFya1t2XSkgewogICAgICAgICAgICAgICAgbWFya1t2XSA9IHRydWU7CiAgICAgICAgICAgICAgICBxLnB1c2godik7CiAgICAgICAgICAgIH0KICAgIH0KCiAgICBpZiAoIW1hcmtbbl0pIHsKICAgICAgICBjb3V0IDw8ICItMVxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBvd28oKTsKICAgIHV3dSgpOwoKICAgIHJldHVybiAwOwp9CgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBGb3IoaSx4LG4pIGZvcihpbnQgKGkpPShpbnQpKHgpOyhpKTw9KGludCkobik7KGkpKyspCiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGRvd24gIlxuIgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIEjDoG0gdOG6oW8gc+G7kSBuZ+G6q3Ugbmhpw6puIHRyb25nIGtob+G6o25nIFtMLCBSXQppbnQgVUlEKGludCBMLCBpbnQgUikgewogICAgc3RhdGljIG10MTk5Mzcgcm5nKGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CiAgICByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4oTCwgUikocm5nKTsKfQoKCnNpZ25lZCBtYWluKCkKewogICAgaW50IE4gPSBVSUQoMiwgMTAwMDAwKTsKICAgIGludCBNID0gVUlEKE4tMSwgbWluKDEwMDAwMCwgTiAqIDEwKSk7IC8vIEVuc3VyZSBhdCBsZWFzdCBhIHBhdGggaXMgcG9zc2libGUsIGJ1dCBub3QgdG9vIGRlbnNlCgogICAgY291dCA8PCBOIDw8ICIgIiA8PCBNIDw8ICdcbic7CgogICAgLy8gSW1wb3J0YW5jZSB2YWx1ZXMgYVtpXQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyArK2kpIHsKICAgICAgICBjb3V0IDw8IFVJRCgxLCAxMDAwKSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8ICdcbic7CgogICAgc2V0PHBhaXI8aW50LCBpbnQ+PiBlZGdlczsKCiAgICAvLyBFbnN1cmUgYXQgbGVhc3QgYSBwYXRoIGZyb20gMSB0byBOIGV4aXN0cwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBOOyArK2kpIHsKICAgICAgICBpbnQgdSA9IGk7CiAgICAgICAgaW50IHYgPSBpICsgMTsKICAgICAgICBlZGdlcy5pbnNlcnQoe3UsIHZ9KTsKICAgICAgICBjb3V0IDw8IHUgPDwgIiAiIDw8IHYgPDwgJ1xuJzsKICAgIH0KCiAgICAvLyBBZGQgcmVtYWluaW5nIHJhbmRvbSBlZGdlcwogICAgd2hpbGUgKChpbnQpZWRnZXMuc2l6ZSgpIDwgTSkgewogICAgICAgIGludCB1ID0gVUlEKDEsIE4pOwogICAgICAgIGludCB2ID0gVUlEKDEsIE4pOwogICAgICAgIGlmICh1ICE9IHYgJiYgIWVkZ2VzLmNvdW50KHt1LCB2fSkpIHsKICAgICAgICAgICAgZWRnZXMuaW5zZXJ0KHt1LCB2fSk7CiAgICAgICAgICAgIGNvdXQgPDwgdSA8PCAiICIgPDwgdiA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMDsKfQo=