func_code_string: #include <bits/stdc++.h>   using namespace std;   int x[2000], y[2000], c[2000];   vector<int> poss;   multiset<int> xx[2000];   vector<pair<int, int> > events;   map<pair<int, int>, int> M;   long long int sum = 0, ans = 0;   int update(int e, int m) {     if (e < 0) return 0;     auto it = M.upper_bound(make_pair(e, 2e9));     it--;     if (it->first.second != e) {       pair<int, int> p = it->first;       int v = it->second;       M.erase(it);       M[make_pair(p.first, e)] = v;       M[make_pair(e + 1, p.second)] = v;     }     it = M.upper_bound(make_pair(e, 2e9));     it--;     if (it->second < m) return 0;     pair<int, int> p = make_pair(e, e);     while (it->second >= m) {       p.first = it->first.first;       sum -= (long long int)(it->first.second - it->first.first + 1) * it->second;       it = M.erase(it);       if (it == M.begin())         break;       else         it--;     }     M[p] = m;     sum += (long long int)(p.second - p.first + 1) * m;     return 0;   }   int main() {     int i;     int n, k, L;     scanf( %d %d %d , &n, &k, &L);     poss.push_back(-1), poss.push_back(L);     for (i = 0; i < n; i++) {       scanf( %d %d %d , &x[i], &y[i], &c[i]), c[i]--;       poss.push_back(y[i]);     }     sort(poss.begin(), poss.end());     poss.resize(unique(poss.begin(), poss.end()) - poss.begin());     int j;     for (i = 1; i < poss.size(); i++) {       int yy = poss[i] - poss[i - 1];       for (j = 0; j < n; j++) {         if (y[j] > poss[i - 1]) {           events.push_back(make_pair(y[j], j));           xx[c[j]].insert(x[j]);         }       }       M.clear();       M[make_pair(0, L - 1)] = L, sum = (long long int)L * L;       for (j = 0; j < k; j++) {         if (xx[j].empty()) break;         int p = -1;         for (auto it = xx[j].begin(); it != xx[j].end(); it++)           update(*it - 1, p + 1), p = *it;         update(L - 1, p + 1);       }       if (j < k) break;       sort(events.begin(), events.end(), greater<pair<int, int> >());       int l = L;       for (j = 0; j < events.size(); j++) {         int u = events[j].second;         long long int nn = (long long int)yy * (l - events[j].first);         nn %= 1000000007;         ans += nn * (sum % 1000000007), ans %= 1000000007;         auto it = xx[c[u]].lower_bound(x[u]);         it = xx[c[u]].erase(it);         int a = (it == xx[c[u]].end()) ? L - 1 : *it - 1;         int b = (it == xx[c[u]].begin()) ? 0 : *(--it) + 1;         update(a, b);         if (xx[c[u]].empty()) break;         l = events[j].first;       }       for (j = 0; j < k; j++) xx[j].clear();       events.clear();     }     printf( %I64d n , ans);     return 0;   }   