From 466f124208c08ea9ed2472af73ad8293b401c41f Mon Sep 17 00:00:00 2001
From: Bruno Freitas Tissei <bft15@inf.ufpr.br>
Date: Tue, 30 Apr 2019 17:46:54 -0300
Subject: [PATCH] Add D to ICPC_LA17

Signed-off-by: Bruno Freitas Tissei <bft15@inf.ufpr.br>
---
 algorithms/paradigm/kadane.cpp |  2 +-
 contests/ICPC_LA17/D.cpp       | 71 ++++++++++++++++++++++++++++++++++
 2 files changed, 72 insertions(+), 1 deletion(-)
 create mode 100644 contests/ICPC_LA17/D.cpp

diff --git a/algorithms/paradigm/kadane.cpp b/algorithms/paradigm/kadane.cpp
index e69765d..5ce946d 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 0000000..c267d5c
--- /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;
+}
-- 
GitLab