#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e6 + 2;
string To_Bin(ll x) {
    ll i, r;
    string str = "";
    for (i = 30; i >= 0; i --) {
        r = 1<<i;
        if ( x >= r) {
            x -= r;
            str = str + "1";
        }
        else str = str + "0";
    }
    r = 0;
    while ( r < str.size() && str[r] == '0') r ++; 
    str = str.substr(r, str.size() - r);
    return str;
}
ll lef[N], rig[N];
ll parent[N], deg[N] = {0}, val[N], teg[N];
void Update(ll par, ll kid) {
	if ( val[par] == 0) {
		val[par] = val[kid];
		teg[par] = teg[kid] + 1;
		return ;
	}
	ll val1, val2, teg1, teg2;
	val1 = val[par];
	val2 = val[kid];
	teg1 = teg[par];
	teg2 = teg[kid] + 1;
	if ( teg1 < teg2) {
		swap(teg1, teg2);
		swap(val1, val2);
	}
	ll dif = teg1 - teg2;
	if ( dif > 30) {
		val[par] = val1;
		teg[par] = teg1;
		return ;
	}
	ll value = val1;
	while ( dif > 0 && value <= val2) {
		value *= 2;
		dif --;
	}
	if ( value > val2) {
		val[par] = val1;
		teg[par] = teg1;
		return ;
	}
	val[par] = val2;
	teg[par] = teg2;
}
int main() {
    ll n, m, r, s, x, i, y;
    cin >> n;
	
    for (i = 1; i <= n; i ++){
        cin >> lef[i] >> rig[i];
        if ( lef[i] > 0) {
        	parent[lef[i]]= i;
        	deg[i]++;
		}
		if ( rig[i] >0) {
			parent[rig[i]] = i;
			deg[i] ++;
		}
    }
    
    queue < ll > q;
    
    for (i = 1; i <= n; i ++) {
    	if (deg[i] == 0) {
    		q.push(i);
    		
		}
		val[i] = max(-lef[i], -rig[i]);
		val[i] =max(val[i], 0ll);
    	teg[i]= 0;
	}
    
    while ( !q.empty()) {
    	x = q.front();
    	q.pop();
    	y = parent[x];
    	Update(y, x);
///    	cout << y << " " << x << " " << val[y] << " " << teg[y] << " " << val[x] << " " << teg[x] << endl; 
    	deg[y] --;
    	if ( deg[y] == 0) {
			q.push(y);
		}
	}
	string str = To_Bin(val[1]);
	cout << str;
	for (i =0 ; i <= teg[1]; i ++) cout << 0;
  //  cout << "HI" <<endl;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |