提交时间:2025-10-08 16:21:57
运行 ID: 38481
#include <algorithm> #include <functional> #include <iostream> #include <queue> #include <utility> #include <vector> using namespace std; using i64 = long long; constexpr int LOG_V = 60; int n; vector<int> in; vector<i64> a, ans; vector<vector<int>> graph; void operator+=(vector<pair<i64, int>>& lhs, const vector<pair<i64, int>>& rhs) { for (auto num : rhs) { auto pos = lower_bound(lhs.begin(), lhs.end(), num, greater {}); if (pos != lhs.end() && pos->second == num.second) continue; lhs.insert(pos, num); while (LOG_V + 5 < lhs.size()) lhs.pop_back(); } } void operator+=(vector<pair<i64, int>>& lhs, const pair<i64, int>& rhs) { auto pos = lower_bound(lhs.begin(), lhs.end(), rhs, greater {}); if (pos != lhs.end() && pos->second == rhs.second) return; lhs.insert(pos, rhs); if (LOG_V + 5 < lhs.size()) lhs.pop_back(); } void solve() { vector<vector<pair<i64, int>>> nums(n + 1); queue<int> nodes; for (int i = 1; i <= n; ++i) { if (in[i] == 0) nodes.push(i); } while (!nodes.empty()) { int u = nodes.front(); nodes.pop(); nums[u] += { a[u], u }; for (auto num1 : nums[u]) { for (auto num2 : nums[u]) { if (num1.second != num2.second) ans[u] = max(ans[u], num1.first & num2.first); } } for (auto v : graph[u]) { nums[v] += nums[u]; if (--in[v] == 0) nodes.push(v); } } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int m; cin >> n >> m; a.resize(n + 1); in.resize(n + 1); graph.resize(n + 1); ans.resize(n + 1, -1); for (int i = 1; i <= n; ++i) cin >> a[i]; for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; graph[v].push_back(u); ++in[u]; } solve(); for (int i = 1; i <= n; ++i) cout << ans[i] << ' '; return 0; }