Submission #111620

#TimeUsernameProblemLanguageResultExecution timeMemory
111620rajarshi_basuPipes (BOI13_pipes)C++14
100 / 100
669 ms17112 KiB
#include <iostream>
#include <vector>
#include <set>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <complex>
#include <stack>
#include <set>

#define FOR(i,n) for(int i=0;i<n;i++)
#define FORE(i,a,b) for(int i=a;i<=b;i++)
#define ll long long int
#define vi vector<int>
#define ii pair<int,int>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define pll pair<ll,ll>
#define cd complex<double> 

const int INF = 1e9;
using namespace std;
const int MAXN = 100*1000 +5;

int nodeVal[MAXN];
int edgesVal[MAXN];
bool marked[MAXN];
vector<ii> g[MAXN];

stack<ii> st;
bool vis[MAXN];
vector<ii> cycle;
bool done = 0;
void markCycle(int node,int p,int pe){
	st.push({node,pe});
	
	if(vis[node]){
		if(done)return;
		done = 1;
		bool got = 0;
	
		while(!st.empty()){

			auto e = st.top();st.pop();
			//marked[e.ff] = 1;
			if(e.ff == node){
				if(got)break;
				got = 1;
				
			}
			cycle.pb(e);
		}
	}else{
		vis[node] = 1;
		for(auto e:g[node]){
			if(e.ff != p){
				markCycle(e.ff,node,e.ss);
			}
		}
	}
	if(!st.empty())st.pop();
}

void dfs(int node,int p,int pe){
	for(auto e:g[node]){
		if(e.ff != p and !marked[e.ff]){
			dfs(e.ff,node,e.ss);
			nodeVal[node] -= nodeVal[e.ff];
		}
	}
	if(pe > -1){
		edgesVal[pe] = nodeVal[node];
	}
}

int main(){
	int n,m;
	cin >> n >> m;
	FOR(i,n)cin >> nodeVal[i];
	FOR(i,m){
		int a,b;
		cin >> a >> b;
		a--;b--;
		g[a].pb({b,i});
		g[b].pb({a,i});
	}
	if(m > n){
		cout << "0" << endl;
	}else if(m < n){
		
		dfs(0,-1,-1);
		FOR(i,m){
			cout << 2*edgesVal[i] << endl;
		}
	}else{
		markCycle(0,-1,-1);
		for(auto e:cycle){
		//	cout << e.ff << " ";
			marked[e.ff] = 1;
		}
		//cout << endl;

		int cnt = 0;
		FOR(i,n){
			if(marked[i]){
				dfs(i,-1,-1);
				cnt++;
			}
		}
		if(cnt%2 == 0){
			cout << 0 << endl;
		}else{
			ll sum = 0;int x = 1;
			for(auto e:cycle){
				sum += nodeVal[e.ff]*x;
				x *= -1;
			}
			edgesVal[cycle.back().ss] = sum/2;
			sum /= 2;
			nodeVal[cycle.back().ff] -= sum;
			nodeVal[cycle.front().ff] -= sum;
			FORE(i,0,(int)cycle.size()-2){
				edgesVal[cycle[i].ss] = nodeVal[cycle[i].ff];
				nodeVal[cycle[i+1].ff] -= edgesVal[cycle[i].ss];
			}
			FOR(i,m){
				cout << 2*edgesVal[i] << endl;
			}
		}
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...