/** 一维前缀和 **/ vector<ll> pre(n + 1); for (int i = 0; i < n; i++) { pre[i + 1] = pre[i] + a[i]; }
// 查询[l, r) auto get = [&](int l, int r) { return pre[r] - pre[l]; };
/** 二维前缀和 **/ vector s(m + 1, vector<ll>(n + 1)); for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { s[x + 1][y + 1] = s[x + 1][y] + s[x][y + 1] - s[x][y] + a[x][y]; } }
// 查询(x1,y1)(含)-(x2,y2)(不含) auto get = [&](int x1, int y1, int x2, int y2) { return s[x2][y2] - s[x1][y2] - s[x2][y1] + s[x1][y1]; };
/** 三维前缀和 **/ vector s(m + 1, vector(n + 1, vector<ll>(p + 1))); for (int x = 0; x < m; x++) { for (int y = 0; y < n; y++) { for (int z = 0; z < p; z++) { s[x + 1][y + 1][z + 1] = a[x][y][z] + s[x + 1][y + 1][z] + s[x + 1][y][z + 1] + s[x][y + 1][z + 1] - s[x + 1][y][z] - s[x][y + 1][z] - s[x][y][z + 1] + s[x][y][z]; } } }
// 查询(x1,y1,z1)(含)-(x2,y2,z2)(不含)的和 auto get = [&](int x1, int y1, int z1, int x2, int y2, int z2) { return s[x2][y2][z2] - s[x1][y2][z2] - s[x2][y1][z2] - s[x2][y2][z1] + s[x1][y1][z2] + s[x1][y2][z1] + s[x2][y1][z1] - s[x1][y1][z1]; };
vector<int> L(n + 1), R(n + 1); for (int i = 0; i < k; i++) { int l, r; cin >> l >> r; l--; L[l]++, R[r]++; } for (int i = 1; i <= n; i++) { R[i] += R[i - 1]; } for (int i = n - 1; i >= 0; i--) { L[i] += L[i + 1]; }
int mx = -1, mn = n + 1; int imx = -1, imn = -1; for (int i = 0; i <= n - d; i++) { int v = R[i] + L[i + d]; if (v > mx) mx = v, imx = i + 1; if (v < mn) mn = v, imn = i + 1; } cout << imn << " " << imx << "\n";
voideachT(){ int n = read(); for (int i = 1; i <= n; i++) a[i] = read(), cnt[i] = ex[i] = 0; for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + (b[i] = read());
for (int i = 1; i <= n; i++) { int r = lower_bound(sum + i, sum + n + 1, a[i] + sum[i - 1]) - sum - 1; cnt[i]++, cnt[r + 1]--; ex[r + 1] += a[i] - (sum[r] - sum[i - 1]); } // [i,r]喝一次 剩下的给r+1
for (int i = 1; i <= n; i++) { cnt[i] += cnt[i - 1]; printf("%lld%c", cnt[i] * b[i] + ex[i], " \n"[i == n]); } }
int n, m; cin >> n >> m; vector<string> s(n); for (int i = 0; i < n; i++) { cin >> s[i]; }
// 二维坐标一维化 auto change = [&](int x, int y) { return x * m + y; }; auto get = [&](int p) { returnpair(p / m, p % m); };
DSU dsu(n * m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (s[i][j] == 'O') continue; if (i && s[i][j] == s[i - 1][j]) dsu.uno(change(i, j), change(i - 1, j)); if (j && s[i][j] == s[i][j - 1]) dsu.uno(change(i, j), change(i, j - 1)); } }
vector<vector<int>> son(n * m); for (int u = 0; u < n * m; u++) { son[dsu.find(u)].push_back(u); }
int res = 0; for (int u = 0; u < n * m; u++) { if (dsu.find(u) != u) continue; auto [x0, y0] = get(u); if (s[x0][y0] == 'O') continue; int cnt = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { bool found = 1; for (auto v : son[u]) { auto [x, y] = get(v); auto [nx, ny] = pair(x + i - x0, y + j - y0); if (nx < 0 || nx >= n || ny < 0 || ny >= m || s[nx][ny] == 'O') { found = 0; } } cnt += found; } } if (cnt == 1) res += dsu.size(u); } cout << res << "\n";
int x = 0, y = 0, D = 0, U = n, L = 0, R = m; for (auto c : s) { if (c == 'D') y++; if (c == 'U') y--; if (c == 'L') x++; if (c == 'R') x--; D = max(D, y); U = min(U, n + y); L = max(L, x); R = min(R, m + x); }
if (D >= U || L >= R) { cout << (k ? 0 : n * m) << '\n'; } else { k = (R - L) * (U - D) - k; // died
vector a(2 * m, vector<int>(2 * n)); int x = m, y = n; a[x][y] = 1; for (auto c : s) { if (c == 'D') y++; if (c == 'U') y--; if (c == 'L') x++; if (c == 'R') x--; a[x][y] = 1; }
// 二维前缀和 vector s(2 * m + 1, vector<int>(2 * n + 1)); for (int x = 0; x < 2 * m; ++x) { for (int y = 0; y < 2 * n; ++y) { s[x + 1][y + 1] = s[x + 1][y] + s[x][y + 1] - s[x][y] + a[x][y]; } } auto get = [&](int x1, int y1, int x2, int y2) { return s[x2][y2] - s[x1][y2] - s[x2][y1] + s[x1][y1]; };
int ans = 0; for (int x = 0; x < m; ++x) { for (int y = 0; y < n; ++y) { if (get(m - x + L, n - y + D, m - x + R, n - y + U) == k) { ans++; } } } cout << ans << '\n'; }