complete 1929.cpp 17425.cpp 32870.cpp 11868.rs

This commit is contained in:
2026-03-21 20:40:37 +09:00
parent 7768f8b446
commit a42056c8d1
4 changed files with 237 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
#include <iostream>
#include <utility>
#define let auto
#define fn auto
#define usize size_t
using namespace std;
const usize MAX_N = 300'000;
fn fastio() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
}
fn main() -> int {
fastio();
let exists = new bool[MAX_N + 1]{false};
let accum_minima = new usize[MAX_N + 2];
let accum_maxima = new usize[MAX_N + 2];
fill_n(accum_minima, MAX_N + 2, __UINT64_MAX__);
usize n, q;
cin >> n >> q;
for (usize i = 0; i < n; i++) {
usize tmp;
cin >> tmp;
exists[tmp] = true;
}
for (usize i = 1; i < MAX_N + 2; i++) {// maximum elem that is less than i
accum_maxima[i] = (exists[i - 1] ? i - 1 : accum_maxima[i - 1]);
}
for (int64_t i = MAX_N; i >= 0; --i) {// minimum elem that is greater or equal than i
accum_minima[i] = (exists[i] ? i : accum_minima[i + 1]);
}
let vis = new bool[MAX_N + 1];
let lo_query = new usize[MAX_N + 1];
let hi_query = new usize[MAX_N + 1];
for (usize ic = 0; ic < q; ic++) {
usize m;
cin >> m;
if (m == 1) {
cout << "0 0\n";
continue;
} else if (vis[m]) {
cout << lo_query[m] << " " << hi_query[m] << "\n";
continue;
}
vis[m] = true;
usize minima = m - 1;
usize maxima = 0;
usize i;
for (i = 0; i <= MAX_N; i += m) {
let key = i;
let t_min = m - 1;
if (accum_minima[key] != __UINT64_MAX__) {
t_min = accum_minima[key] % m;
}
let t_max = accum_maxima[key] % m;
minima = min(minima, t_min);
maxima = max(maxima, t_max);
}
if (i > MAX_N) {
maxima = max(maxima, accum_maxima[MAX_N + 1] % m);
}
lo_query[m] = minima;
hi_query[m] = maxima;
cout << minima << " " << maxima << "\n";
}
// free
delete[] exists;
delete[] accum_minima;
delete[] accum_maxima;
delete[] vis;
delete[] lo_query;
delete[] hi_query;
}