給排列,q 次區間查詢:區間內任意兩數的最大公約數。等價於:找最大的 d,使區間內至少有兩個數是 d 的倍數。
update(pos, val) 取最大query(L, R) 返回最大值for (int i = 1; i <= n; ++i) {
for (int d : divisors[a[i]]) {
if (last[d]) seg.update(last[d], d); // 前一位置標記此約數
last[d] = i;
}
while (q_idx < Q && queries[q_idx].r == i) {
ans[queries[q_idx].id] = seg.query(queries[q_idx].l, i);
++q_idx;
}
}
約數枚舉 O(n √MAXA),排序 O(q log q),線段樹操作 O((n+q) log n)。總體 ~10⁷ 操作,1秒內輕鬆通過。