This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
void end()
{
cout << 0 << endl;
exit(0);
}
const int maxn = 1e5 + 5;
vector<pair<int, int> > g[maxn];
int deg[maxn], vis[maxn], n[maxn], e[maxn];
ll sum[maxn*2];
vector<int> cy;
void dfs(int u, int p, int st)
{
if (u == st && p != -1) return;
sum[cy.size()] = n[u];
for (pair<int, int> v : g[u]) if (!vis[v.first] && v.first != p)
{
cy.push_back(v.second);
dfs(v.first, u, st);
if (u == st) return;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int N, M;
cin >> N >> M;
if (M > N) end();
for (int i = 0; i < N; i++) cin >> n[i];
for (int i = 0, u, v; i < M; i++)
{
cin >> u >> v;
g[--u].push_back({--v, i}), g[v].push_back({u, i});
deg[u]++, deg[v]++;
}
vector<int> stk;
for (int i = 0; i < N; i++) if (deg[i] == 1) stk.push_back(i);
while (!stk.empty())
{
int u = stk.back(); stk.pop_back();
vis[u] = true;
for (pair<int, int> v : g[u]) if (!vis[v.first])
{
e[v.second] = n[u]*2;
n[v.first] -= n[u];
deg[v.first]--;
if (deg[v.first] == 1) stk.push_back(v.first);
}
}
if (N == M) // ostal nam cyklus
{
for (int i = 0; i < N; i++) if (!vis[i])
{
dfs(i, -1, i);
break;
}
int k = cy.size();
if (!(k&1)) end();
for (int i = k; i < 2*k; i++) sum[i] = sum[i-cy.size()];
for (int i = 0; i < 2*k; i++) if (i&1) sum[i] *= -1;
for (int i = 1; i < 2*k; i++) sum[i] += sum[i-1];
for (int i = 0; i < k; i++)
{
e[cy[i]] = sum[i+k]-sum[i];
if (!(i&1)) e[cy[i]] *= -1;
}
}
for (int i = 0; i < M; i++) cout << e[i] << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |