diff --git "a/khj20006/202510/23 BOJ D4 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 0.md" "b/khj20006/202510/23 BOJ D4 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 0.md" new file mode 100644 index 00000000..b5c0c91a --- /dev/null +++ "b/khj20006/202510/23 BOJ D4 \354\210\230\354\227\264\352\263\274 \354\277\274\353\246\254 0.md" @@ -0,0 +1,93 @@ +```cpp +#include +using namespace std; + +int N, Q, sq, s[100001]{}; +deque v[200001]{}; +int c[200001]{}, cc[801]{}, ans[100000]{}; +tuple qs[100000]{}; + +int main() { + cin.tie(0)->sync_with_stdio(0); + + cin >> N; + sq = sqrt(N); + for (int i = 1; i <= N; i++) { + cin >> s[i]; + s[i] += s[i - 1]; + } + + cin >> Q; + for (int i = 0; i < Q; i++) { + auto& [l, r, x] = qs[i]; + cin >> l >> r; + x = i; + l--; + } + + sort(qs, qs + Q, [](auto a, auto b) -> bool { + auto [al, ar, ax] = a; + auto [bl, br, bx] = b; + if (al / sq == bl / sq) return ar < br; + return al / sq < bl / sq; + }); + + int l = 0, r = 0; + v[100000].push_back(0); + c[100000]++, cc[100000 / sq]++; + for (int i = 0; i < Q; i++) { + auto [pl, pr, x] = qs[i]; + while (r < pr) { + int z = s[++r] + 100000; + if (!v[z].empty()) { + c[v[z].back() - v[z].front()]--; + cc[(v[z].back() - v[z].front()) / sq]--; + } + v[z].push_back(r); + c[v[z].back() - v[z].front()]++; + cc[(v[z].back() - v[z].front()) / sq]++; + } + while (pr < r) { + int z = s[r--] + 100000; + c[v[z].back() - v[z].front()]--; + cc[(v[z].back() - v[z].front()) / sq]--; + v[z].pop_back(); + if (!v[z].empty()) { + c[v[z].back() - v[z].front()]++; + cc[(v[z].back() - v[z].front()) / sq]++; + } + } + while (l < pl) { + int z = s[l++] + 100000; + c[v[z].back() - v[z].front()]--; + cc[(v[z].back() - v[z].front()) / sq]--; + v[z].pop_front(); + if (!v[z].empty()) { + c[v[z].back() - v[z].front()]++; + cc[(v[z].back() - v[z].front()) / sq]++; + } + } + while (pl < l) { + int z = s[--l] + 100000; + if (!v[z].empty()) { + c[v[z].back() - v[z].front()]--; + cc[(v[z].back() - v[z].front()) / sq]--; + } + v[z].push_front(l); + c[v[z].back() - v[z].front()]++; + cc[(v[z].back() - v[z].front()) / sq]++; + } + + for (int i = 800; i >= 0; i--) if (cc[i]) { + for (int j = sq * (i + 1) - 1; j >= sq * i; j--) if (c[j]) { + ans[x] = j; + break; + } + break; + } + } + + for (int i = 0; i < Q; i++) cout << ans[i] << '\n'; + +} +```