Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define pii pair<int,int>
- #define pll pair<ll,ll>
- #define pli pair<ll,int>
- #define fi first
- #define se second
- #define inf (INT_MAX/2-1)
- #define infl (1LL<<60)
- #define vi vector<int>
- #define pb push_back
- #define sz(a) (int)(a).size()
- #define all(a) begin(a),end(a)
- #define y0 y5656
- #define y1 y7878
- #define aaa system("pause");
- #define dbg(x) cerr<<(#x)<<": "<<(x)<<'\n',aaa
- #define dbga(x,n) cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)cerr<<x[_]<<' ';cerr<<'\n',aaa
- #define dbgs(x) cerr<<(#x)<<"[stl]: ";for(auto _:x)cerr<<_<<' ';cerr<<'\n',aaa
- #define dbgp(x) cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
- #define maxn 100000
- #define ml2 18
- using namespace std;
- ifstream fin ("gathering.in");
- ofstream fout ("gathering.out");
- int n, m;
- vi g[maxn+5], fii[maxn+5], tour, g2[maxn+5];
- int rmq[2*maxn+5][ml2+5], lg[2*maxn+5], fapr[maxn+5], niv[maxn+5], ans[maxn+5];
- bool ancestor[maxn+5], viz[maxn+5];
- void dfsi (int nod, int t) {
- if (nod != 0) niv[nod] = 1+niv[t];
- for (int nn: g[nod])
- if (nn != t) fii[nod].pb(nn), dfsi(nn, nod);
- }
- void dfst (int nod) {
- if (fapr[nod] == -1) fapr[nod] = sz(tour);
- tour.pb(nod);
- for (int nn: fii[nod]) dfst(nn), tour.pb(nod);
- }
- void prelca () {
- fill(all(fapr), -1);
- dfst(0);
- int i, j;
- for (i = 2; i <= sz(tour); i++) lg[i] = 1+lg[i>>1];
- for (i = 0; i < sz(tour); i++) rmq[i][0] = tour[i];
- for (j = 1; j <= lg[sz(tour)]; j++)
- for (i = 0; i+(1<<j)-1 < sz(tour); i++) { ///-1!!
- rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
- if (niv[rmq[i][j]] > niv[rmq[i][j-1]]) rmq[i][j] = rmq[i][j-1];
- }
- }
- int lca (int a, int b) {
- if (fapr[a] > fapr[b]) swap(a, b);
- int ile = lg[fapr[b]-fapr[a]+1];
- int x = rmq[fapr[a]][ile], y = rmq[fapr[b]-(1<<ile)+1][ile];///1<<!
- if (niv[x] < niv[y]) return x;
- return y;
- }
- int dist (int a, int b) {
- int c = lca(a, b);
- return niv[a] + niv[b] - 2*niv[c];
- }
- void dfs (int nod, int prew, int b) {
- if (ans[nod] == 0) return;
- if (dist(nod, b) < dist(prew, b)) return;
- ans[nod] = 0;
- for (int nn: g[nod]) dfs(nn, nod, b);
- }
- void special () {
- for (int i = 0; i < n; i++) fout << 0 << '\n';
- exit(0);
- }
- void dfsc (int nod) {
- viz[nod] = 1;
- ancestor[nod] = 1;
- for (int nn: g2[nod]) {
- if (ancestor[nn]) special();
- dfsc(nn);
- }
- ancestor[nod] = 0;
- }
- int main () {
- fin >> n >> m;
- int i, a, b;
- for (i = 0; i < n-1; i++) {
- fin >> a >> b; a--; b--;
- g[a].pb(b);
- g[b].pb(a);
- }
- dfsi(0, -1);
- prelca();
- fill(all(ans), 1);
- for (i = 0; i < m; i++) {
- fin >> a >> b; a--; b--;
- g2[a].pb(b);
- ans[a] = 0;
- for (int nn: g[a]) dfs (nn, a, b);
- }
- for (i = 0; i < n; i++)
- if (!viz[i]) dfsc (i);
- for (i = 0; i < n; i++) fout << ans[i] << '\n';
- fin.close(); fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement