diff --git a/contests/ICPC_LA17/B.cpp b/contests/ICPC_LA17/B.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1c7531f56c5b275438590d314f6647fe541ab73c
--- /dev/null
+++ b/contests/ICPC_LA17/B.cpp
@@ -0,0 +1,70 @@
+#include <bits/stdc++.h>
+
+#define EPS 1e-6
+#define MOD 1000000007
+#define inf 0x3f3f3f3f
+#define llinf 0x3f3f3f3f3f3f3f3f
+
+#define fi first
+#define se second
+#define pb push_back
+#define ende '\n'
+
+#define all(x) (x).begin(), (x).end()
+#define rall(x) (x).rbegin(), (x).rend()
+#define mset(x, y) memset(&x, (y), sizeof(x))
+
+using namespace std; 
+
+using ll = long long;
+using ii = pair<int,int>;
+
+bool is_vowel(char x) {
+  return x == 'a' || x == 'e' || x == 'i' || x == 'o' || x == 'u';
+}
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  int num_vow = 0;
+  string s; cin >> s;
+  for (auto i : s) num_vow += is_vowel(i);
+  if (num_vow && !is_vowel(s[0])) 
+    return cout << 0 << ende, 0;
+  if (num_vow == 0)
+    return cout << 1 << ende, 0;
+
+  int i = 0, n = s.size() - 1;
+  bool inverted = false;
+
+  auto invert = [&]() {
+    swap(i, n);
+    inverted = !inverted;
+  };
+
+  auto trim_tail = [&]() {
+    if (inverted) n++;
+    else n--;
+  };
+
+  int ans = 0;
+  while (abs(n - i)) {
+    if (is_vowel(s[i]) && is_vowel(s[n])) {
+      invert();
+      trim_tail();
+      num_vow--;
+    } else if (!is_vowel(s[i]) && is_vowel(s[n])) {
+      break;
+    } else if (is_vowel(s[i]) && !is_vowel(s[n])) {
+      if (num_vow == 1) ans++;
+      trim_tail();
+    } else if (!is_vowel(s[i]) && !is_vowel(s[n])) {
+      trim_tail();
+    }
+  }
+
+  if (i == n && is_vowel(s[i])) ans++;
+  cout << ans << ende;
+  return 0;
+}
diff --git a/contests/ICPC_LA17/F.cpp b/contests/ICPC_LA17/F.cpp
index 52ca75196676a64be7197a709236f1926cf7c1b0..f08ae7363250fd0e34f45890251c527f280857c7 100644
--- a/contests/ICPC_LA17/F.cpp
+++ b/contests/ICPC_LA17/F.cpp
@@ -1,5 +1,6 @@
 #include <bits/stdc++.h>
 
+#define MAX 101010
 #define EPS 1e-6
 #define MOD 1000000007
 #define inf 0x3f3f3f3f
@@ -20,10 +21,38 @@ using ll = long long;
 using ii = pair<ll,ll>;
 using iii = pair<ii,ll>;
 
+struct BIT {
+  int N;
+  vector<ll> tree;
+
+  BIT(int N) :
+    N(N), tree(N)
+  {}
+
+  void init() {
+    fill(all(tree), 0LL);
+  }
+
+  ll query(int idx) {
+    ll sum = 0LL;
+    for (; idx > 0; idx -= (idx & -idx))
+      sum = max(sum, tree[idx]);
+    return sum;
+  }
+
+  void update(int idx, ll val) {
+    for (; idx < N; idx += (idx & -idx))
+      tree[idx] = max(tree[idx], val);
+  }
+};
+
 int main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
 
+  BIT bit(MAX);
+  bit.init();
+
   map<ii,ll> M;
   int n; cin >> n;
   for (int i = 0; i < n; ++i) {
@@ -32,18 +61,43 @@ int main() {
   }
 
   vector<iii> v;
-  for (auto i : M) {
-    v.pb(iii(ii(i.fi.se, i.fi.se), i.se));
-  }
+  for (auto i : M)
+    v.pb(iii(ii(i.fi.fi, i.fi.se), i.se));
+  n = v.size();
 
-  return 0;
-}
+  sort(all(v), [](const iii &a, const iii &b) {
+    if (a.fi.fi != b.fi.fi)
+      return a.fi.fi < b.fi.fi;
+    else if (a.fi.se != b.fi.se)
+      return a.fi.se > b.fi.se;
+    return a.se > b.se;
+  });
+
+  set<ll> S;
+  map<ll,ll> compress;
+  for (auto i : v)
+    S.insert(i.fi.se);
+
+  ll k = 1LL;
+  for (auto i : S)
+    compress[i] = k++;
+  for (auto &i : v)
+    i.fi.se = compress[i.fi.se];
 
-2 8 13
-1 4 12
-2 1 16
+  ll ans = 0, last = v[0].fi.fi;
+  for (int i = 0; ; ) {
+    for (; i < n && v[i].fi.fi == last; ++i) {
+      ll bst = max(bit.query(v[i].fi.se - 1) + v[i].se, 
+                   bit.query(v[i].fi.se));
 
+      bit.update(v[i].fi.se, bst);
+      ans = max(ans, bst);
+    }
 
-1 4 12
-2 8 13
-2 1 16
+    if (i >= n) break;
+    last = v[i].fi.fi;
+  }
+
+  cout << ans << ende;
+  return 0;
+}
diff --git a/contests/ICPC_LA17/G.cpp b/contests/ICPC_LA17/G.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9ddc811335c5d4071a2c9b0282df994cf9116358
--- /dev/null
+++ b/contests/ICPC_LA17/G.cpp
@@ -0,0 +1,78 @@
+#include <bits/stdc++.h>
+
+#define MAX 101010
+#define EPS 1e-6
+#define MOD 1000000007
+#define inf 0x3f3f3f3f
+#define llinf 0x3f3f3f3f3f3f3f3f
+
+#define fi first
+#define se second
+#define pb push_back
+#define ende '\n'
+
+#define all(x) (x).begin(), (x).end()
+#define rall(x) (x).rbegin(), (x).rend()
+#define mset(x, y) memset(&x, (y), sizeof(x))
+
+using namespace std; 
+
+using ll = long long;
+using ii = pair<int,int>;
+
+map<int,ii> forw;
+map<ii,int> backw;
+int L[MAX], R[MAX], val[MAX];
+
+struct comb {
+  ll pos[4];
+
+  comb() { mset(pos, 0); }
+
+  static comb base() {
+    comb res;
+    res.pos[0] = res.pos[3] = 1;
+    return res;
+  }
+};
+
+comb dfs(int x) {
+  comb res;
+  comb l = (L[x]) ? (dfs(L[x])) : (comb::base());
+  comb r = (R[x]) ? (dfs(R[x])) : (comb::base());
+
+  for (int i = 0; i < 4; ++i)
+    for (int j = 0; j < 4; ++j) {
+      ii nand = ii(!(forw[i].fi && forw[j].fi), !(forw[i].se && forw[j].se));
+      res.pos[backw[nand]] = (res.pos[backw[nand]] + 
+          (l.pos[i] % MOD) * (r.pos[j] % MOD)) % MOD;
+    }
+
+  if (val[x] == 0) {
+    res.pos[0] = (res.pos[0] + res.pos[2]) % MOD, res.pos[2] = 0;
+    res.pos[1] = (res.pos[1] + res.pos[3]) % MOD, res.pos[3] = 0;
+  } else if (val[x] == 1) {
+    res.pos[2] = (res.pos[2] + res.pos[0]) % MOD, res.pos[0] = 0;
+    res.pos[3] = (res.pos[3] + res.pos[1]) % MOD, res.pos[1] = 0;
+  }
+
+  return res;
+}
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  int n; cin >> n;
+  for (int i = 1; i <= n; ++i)
+    cin >> L[i] >> R[i] >> val[i];
+
+  forw[0] = ii(0, 0); backw[ii(0, 0)] = 0;
+  forw[1] = ii(0, 1); backw[ii(0, 1)] = 1;
+  forw[2] = ii(1, 0); backw[ii(1, 0)] = 2;
+  forw[3] = ii(1, 1); backw[ii(1, 1)] = 3;
+
+  comb ans = dfs(1);
+  cout << (ans.pos[1] + ans.pos[2]) % MOD << ende;
+  return 0;
+}