diff --git a/algorithms/paradigm/kadane.cpp b/algorithms/paradigm/kadane.cpp
index e69765dfdd1eb630320d054ccd8329844d0ca446..5ce946d07edc3de78b46f1c1c80f7597e971d23d 100644
--- a/algorithms/paradigm/kadane.cpp
+++ b/algorithms/paradigm/kadane.cpp
@@ -12,7 +12,7 @@ int kadane(const vector<int> &v, int &start, int &end) {
   start = end = 0;
 
   // Maximum so far (msf), Maximum ending here (meh).
-  int msf = -0x3f3f3f3f, meh = 0;
+  int msf = -inf, meh = 0;
 
   for (int i = 0; i < n; ++i) {
     meh += v[i];
diff --git a/contests/ICPC_LA17/D.cpp b/contests/ICPC_LA17/D.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c267d5c7b0e3973a799d7c499cf180838958073c
--- /dev/null
+++ b/contests/ICPC_LA17/D.cpp
@@ -0,0 +1,71 @@
+#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>;
+using iii = pair<ii,int>;
+
+int main() {
+  ios::sync_with_stdio(0);
+  cin.tie(0);
+
+  ll l, c, n; cin >> l >> c >> n;
+  set<iii> S;
+  S.insert(iii(ii(0, l - 1), 1));
+  vector<ll> num(c+1, 0);
+  num[1] = l;
+
+  for (int i = 0; i < n; ++i) {
+    ll p, x, a, b; cin >> p >> x >> a >> b;
+    int m1 = (a + num[p] * num[p]) % l;
+    int m2 = (a + (num[p] + b) * (num[p] + b)) % l;
+
+    if (m1 > m2) swap(m1, m2);
+    auto curr = prev(S.lower_bound(iii(ii(m1 + 1, -inf), -inf)));
+    
+    vector<iii> ins, del;
+    ins.pb(iii(ii(m1, m2), x));
+    for ( ; curr != S.end() && curr->fi.fi <= m2; ++curr) {
+      num[curr->se] -= curr->fi.se - curr->fi.fi + 1;
+
+      // m1 intersects with section
+      if (m1 >= curr->fi.fi && m1 <= curr->fi.se) {
+        ins.pb(iii(ii(curr->fi.fi, m1 - 1), curr->se));
+        num[curr->se] += (m1 - 1) - curr->fi.fi + 1;
+      }
+
+      // m2 intersects with section
+      if (m2 >= curr->fi.fi && m2 <= curr->fi.se) {
+        ins.pb(iii(ii(m2 + 1, curr->fi.se), curr->se));
+        num[curr->se] += curr->fi.se - (m2 + 1) + 1;
+      }
+
+      num[x] += min(m2, curr->fi.se) - max(m1, curr->fi.fi) + 1;
+      del.pb(*curr);
+    }
+
+    for (auto j : del) S.erase(j);
+    for (auto j : ins) S.insert(j);
+  }
+
+  ll ans = 0;
+  for (int i = 1; i <= c; ++i)
+    ans = max(ans, num[i]);
+  cout << ans << ende;
+  return 0;
+}