Submission #1555796


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
#define GET_MACRO(_1, _2, _3, NAME, ...) NAME
#define _repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define _rep(i,n) _repl(i,0,n)
#define rep(...) GET_MACRO(__VA_ARGS__, _repl, _rep)(__VA_ARGS__)
#define mp(a,b) make_pair((a),(b))
#define pb(a) push_back((a))
#define all(x) (x).begin(),(x).end()
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
void _dbg(string){cout<<endl;}
template<class H,class... T> void _dbg(string s,H h,T... t){int l=s.find(',');cout<<s.substr(0,l)<<" = "<<h<<", ";_dbg(s.substr(l+1),t...);}
template<class T,class U> ostream& operator<<(ostream &o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream &o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

#define INF 1000000005
#define N 100005

int n;
int num[N];
int ans[N], lf[N], ri[N];
vector<int> arr;
vector<int> tree[N];

//seg tree data
multiset<int> data[1<<18];
int sz;

void tour(int v){
  lf[v] = arr.size();
  arr.pb(num[v]);
  for(auto to : tree[v]) tour(to);
  ri[v] = arr.size();
}

inline void del(int x, int p){
  x += sz-1;
  data[x].erase(data[x].lower_bound(p));
  while(x>0){
    x = (x-1)/2;
    data[x].erase(data[x].lower_bound(p));
  }
}

inline void ins(int x, int p){
  x += sz-1;
  data[x].insert(p);
  while(x>0){
    x = (x-1)/2;
    data[x].insert(p);
  }
}

inline void upd(int &l, const int r, const int x){
  int dl = abs(l-x), dr=abs(r-x);
  if(dl==dr && r<l) l = r;
  if(dl > dr) l = r;
}

int query(int a, int b, int x, int k, int l, int r){
  if(r<=a || b<=l) return -INF;
  if(a<=l && r<=b){
    auto itr = data[k].lower_bound(x);
    int ret = -INF;
    if(itr != data[k].end()) upd(ret, *itr,  x);
    if(itr != data[k].begin()) upd(ret, *(--itr), x);
    return ret;
  }
  int vl = query(a,b,x,k*2+1,l,(r+l)/2);
  int vr = query(a,b,x,k*2+2,(r+l)/2,r);
  int ret = -INF;
  upd(ret, vl, x);
  upd(ret, vr, x);
  return ret;
}

inline int query(int a, int b, int x){
  return query(a,b,x,0,0,sz);
}

void dfs(int v){
  int x  = num[v];
  int v1 = query(0, lf[v], x);
  int v2 = query(ri[v], n, x);

  ans[v] = -INF;
  upd(ans[v], v1, x);
  upd(ans[v], v2, x);

  if(tree[v].size()>0){
    del(lf[v], x);
    for(auto to : tree[v]) dfs(to);
    ins(lf[v], x);
  }
}

int main(){
  cin>>n;
  vector<int> par(n, -1);
  rep(i,n) cin>>num[i];

  rep(i,n-1){
    int a,b;
    cin>>a>>b;
    tree[a].pb(b);
    par[b] = a;
  }

  int root = -1;
  rep(i,n) if(par[i] == -1) root = i;

  tour(root);

  sz=1;
  while(sz<n) sz*=2;
  rep(i,n) data[i+sz-1].insert(arr[i]);
  for(int i=sz-2; i>=0; i--){
    data[i] = data[2*i+1];
    for(auto x : data[2*i+2]) data[i].insert(x);
  }

  dfs(root);

  rep(i,n) if(ans[i]==2*INF || ans[i]==-INF) ans[i] = -1;
  rep(i,n) cout << ans[i] << endl;

  return 0;
}

Submission Info

Submission Time
Task I - 支配と友好
User tossy
Language C++14 (GCC 5.4.1)
Score 200
Code Size 3062 Byte
Status AC
Exec Time 1368 ms
Memory 111224 KB

Judge Result

Set Name All
Score / Max Score 200 / 200
Status
AC × 45
Set Name Test Cases
All sample01, sample02, sample03, binary00, binary01, binary02, binary03, hand00, line00, line01, line02, random00, random01, random02, random03, random04, random05, random06, random07, random08, sample01, sample02, sample03, star00, star01, star02, ternary00, ternary01, ternary02, ternary03, thin00, thin01, thin02, thin03, thin04, thin05, thin06, thin07, uniform00, uniform01, uniform02, uniform03, uniform04, uniform05, uniform06
Case Name Status Exec Time Memory
binary00 AC 1368 ms 103416 KB
binary01 AC 1227 ms 103672 KB
binary02 AC 1216 ms 103928 KB
binary03 AC 1211 ms 104056 KB
hand00 AC 860 ms 108660 KB
line00 AC 1165 ms 111224 KB
line01 AC 1137 ms 111224 KB
line02 AC 1144 ms 111224 KB
random00 AC 1226 ms 103420 KB
random01 AC 1362 ms 103548 KB
random02 AC 1266 ms 103548 KB
random03 AC 1215 ms 103676 KB
random04 AC 1196 ms 103800 KB
random05 AC 1194 ms 103932 KB
random06 AC 1192 ms 103932 KB
random07 AC 1199 ms 104060 KB
random08 AC 1196 ms 104184 KB
sample01 AC 6 ms 14848 KB
sample02 AC 6 ms 14848 KB
sample03 AC 6 ms 14848 KB
star00 AC 743 ms 102264 KB
star01 AC 748 ms 102520 KB
star02 AC 760 ms 102904 KB
ternary00 AC 1189 ms 102904 KB
ternary01 AC 1089 ms 103160 KB
ternary02 AC 1057 ms 103416 KB
ternary03 AC 1063 ms 103544 KB
thin00 AC 1236 ms 106616 KB
thin01 AC 1125 ms 104952 KB
thin02 AC 1220 ms 106744 KB
thin03 AC 1104 ms 105208 KB
thin04 AC 1207 ms 107000 KB
thin05 AC 1093 ms 105464 KB
thin06 AC 1214 ms 107256 KB
thin07 AC 1106 ms 105720 KB
uniform00 AC 989 ms 103288 KB
uniform01 AC 950 ms 103672 KB
uniform02 AC 860 ms 105072 KB
uniform03 AC 858 ms 103292 KB
uniform04 AC 824 ms 103160 KB
uniform05 AC 810 ms 103036 KB
uniform06 AC 788 ms 102912 KB