作业题解
考虑根号分治,设值域为
首先我们有一个阈值
然后我们也要用一个 set 来表示
在执行操作一时,我们维护上述的
执行操作二时,我们可以对 set 中二分找到第一个大于等于
然后当
注意:然而 set 的二分查找是有常数的,所以
#include <bits/stdc++.h>
// using pii=std::pair<int, int>;
const int sq(650);
int q;
std::bitset<sq+5> bit[sq+5];
std::set<int> st;
void solve() {
std::cin>>q;
while(q--) {
char op;
int x;
std::cin>>op>>x;
if(op=='A') {
st.insert(x);
for(int i(1); i<=sq; i++) bit[i][x%i]=1;
} else {
if(x<=sq) {
for(int i(0); i<x; i++) {
if(bit[x][i]) { std::cout<<i<<"\n"; break; }
}
} else {
int ans(300000+5);
for(int i(0); i<=300000; i+=x) {
auto j(st.lower_bound(i));
if(j==st.end()) continue;
ans=std::min(ans, (*j)%x);
}
std::cout<<ans<<"\n";
}
}
}
}
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
solve();
return 0;
}