#include<bits/stdc++.h> #define all(x) x.begin(), x.end() using ll = longlong; using ld = longdouble; constexprint N = 1e6 + 10;
struct_edge { int from, to; ll depart, arrive; ld p; }; std::vector<_edge> G; std::map<ll, ld> F[N]; int m, n; ll k;
intmain(){ std::cin >> m >> n >> k; for (int i = 0, u, v; i < m; i++) { ll d, a; ld pr; std::cin >> u >> v >> d >> a >> pr; G.push_back({u, v, d, a, pr}); }
std::sort(all(G), [](_edge &a, _edge &b) { return a.depart > b.depart; }); F[1].insert({k + 1, 1.0L}); for (int i = 0; i < n; i++) if (i != 1) F[i].insert({k + 1, 0.0L});
for (auto &[from, to, depart, arrive, p] : G) { if (F[to].empty()) continue;
auto arv = F[to].upper_bound(arrive); auto dpr = F[from].upper_bound(depart);
std::array<int, M * 8> fenwick; int maxsz; voidreset(int maxsize){ maxsz = maxsize; for (int i = 0; i <= maxsize; i++) fenwick[i] = 0; } voidadd(int pos, int v){ for (; pos <= maxsz; pos += pos & -pos) fenwick[pos] += v; } intsum(int p){ int res = 0; for (; p > 0; p -= p & -p) res += fenwick[p]; return res; } intrange(int l, int r = -1){ if (r == -1) r = maxsz; if (l > r) return0; elsereturnsum(r) - sum(l - 1); } voidlogFT(){ for (int i = 1; i <= maxsz; i++) std::cout << range(i, i) << " \n"[i == maxsz]; }
intmain(){ std::cin >> r >> c, std::cin.ignore();
for (int i = 1; i < 2 * r; i++) { std::getline(std::cin, T[i]); if (i % 2 == 0) continue; for (int j = 0; j < T[i].length(); j++) if (T[i][j] == 'x') ID[i][j] = ++cnt, line[i - j].push_back({i, j}); }
[&] { // Left extend for (int i = 1; i < 2 * r; i += 2) { for (int j = i % 4 + 3; j < T[i].length(); j += 4) if (T[i][j - 1] == '-') L[ID[i][j]] = 1 + L[ID[i][j - 4]]; } // Right extend for (int i = 1; i < 2 * r; i += 2) { for (int j = T[i].length() - 1; j >= 0; j--) { if (T[i][j] != 'x') continue; if (j + 4 < T[i].length() && T[i][j + 1] == '-') R[ID[i][j]] = 1 + R[ID[i][j + 4]]; } }
// Up left & Up Right for (int i = 2; i < 2 * r; i += 2) { for (int j = 0; j < T[i].length(); j++) { if (T[i][j] == '\\') UL[ID[i + 1][j + 1]] = 1 + UL[ID[i - 1][j - 1]]; elseif (T[i][j] == '/') UR[ID[i + 1][j - 1]] = 1 + UR[ID[i - 1][j + 1]]; } }
// Down left for (int i = 2 * r - 2; i >= 1; i -= 2) { for (int j = 0; j < T[i].length(); j++) { if (T[i][j] == '/') DL[ID[i - 1][j + 1]] = 1 + DL[ID[i + 1][j - 1]]; } } }();
// Suppose point is Bottom Right point for (auto &item : line) { auto &points = item.second; int m = points.size();
// for (auto p : points) { // auto [x, y] = p; // T[x][y] = '*'; // }
// for (int i = 1; i < 2 * r; i++) { // for (int j = 0; j < T[i].length(); j++) { // if (T[i][j] != 'x') std::cout << T[i][j]; // else std::cout << 'o'; // } // std::cout << "\n"; // }
reset(m); std::set<pii> maintain; // j + DL[j], j for (int i = 1; i <= m; i++) { auto [x, y] = points[i - 1]; int id = ID[x][y]; int rg = std::min(L[id], UL[id]); while (maintain.size()) { auto [val, idx] = *maintain.begin(); if (val < i) add(idx, -1), maintain.erase(maintain.begin()); elsebreak; }
// logFT(); // std::fprintf(stdout, "l = %d, i = %d, dans = %d\n", maintain.begin()->second, i, range(i - rg, i - 1));
ans += range(i - rg, i - 1); add(i, 1); maintain.insert({i + DL[ID[x][y]], i}); }
for (auto p : points) { auto [x, y] = p; T[x][y] = 'x'; }
std::cout << "\n"; }
// Suppose point is top point for (auto &[_, points] : line) { // for (auto p : points) { // auto [x, y] = p; // T[x][y] = '*'; // }
// for (int i = 1; i < 2 * r; i++) { // for (int j = 0; j < T[i].length(); j++) { // if (T[i][j] != 'x') std::cout << T[i][j]; // else std::cout << 'o'; // } // std::cout << "\n"; // }
int m = points.size(); reset(m); std::set<pii> mt; // R[j]+j, j for (int i = 1; i <= m; i++) { auto [x, y] = points[i - 1]; int id = ID[x][y]; int rg = std::min(UR[id], UL[id]); while (mt.size()) { auto [val, idx] = *mt.begin(); if (val < i) add(idx, -1), mt.erase(mt.begin()); elsebreak; }
// logFT(); // std::fprintf(stdout, "l = %d, i = %d, dans = %d\n", mt.begin()->second, i, range(i - rg, i - 1));
ans += range(i - rg, i - 1); add(i, 1), mt.insert({i + R[ID[x][y]], i}); }
// for (auto p : points) { // auto [x, y] = p; // T[x][y] = 'x'; // } // std::cout << "\n"; }