This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define pii pair<int, int>
#define piii pair<pii, int>
#define vi vector<int>
#define vvi vector<vi>
#define vpii vector<pii>
#define vvpii vector<vpii>
#define f first
#define s second
#define oo 1000000001
#define eb emplace_back
#define pb push_back
#define mpr make_pair
#define size(v) (int)v.size()
#define ln '\n'
#define ull unsigned long long
#define ll long long
#define all(v) v.begin(), v.end()
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int up = 1e6 + 6;
int toRight[up], tree[up << 2];
void init(int n) {
for (int i = 1; i <= n; ++i) {
toRight[i] = oo;
}
for (int i = 1; i <= (n << 2); ++i) {
tree[i] = oo;
}
}
void update(int node, int l, int r, int pos) {
if (l == r) {
tree[node] = toRight[pos];
} else {
int mid = (l + r) >> 1;
if (pos <= mid) update((node << 1), l, mid, pos);
else update((node << 1) | 1, mid + 1, r, pos);
tree[node] = min(tree[(node << 1)], tree[(node << 1) | 1]);
}
}
int getMin(int node, int l, int r, int ql, int qr) {
if (l > qr || ql > r) return oo;
else if (ql <= l && r <= qr) {
return tree[node];
} else {
int mid = (l + r) >> 1;
return min(getMin((node << 1), l, mid, ql, qr), getMin((node << 1) | 1, mid + 1, r, ql, qr));
}
}
void sieve(int n, vector<vector<int>> &pfactor) {
vector<bool>isPrime(n + 1, true);
for (int i = 2; i <= n; ++i) {
if (isPrime[i]) {
for (int j = i; j <= n; j += i) {
pfactor[j].eb(i);
isPrime[j] = false;
}
}
}
}
void Add(int x, int n, vector<vector<int>> &pfactor, vector<set<int>> &group) {
for (int p : pfactor[x]) {
group[p].insert(x);
auto itr = group[p].find(x);
if (itr != group[p].begin()) {
--itr;
int prev = (*itr);
if (toRight[prev] > x) {
toRight[prev] = x;
update(1, 1, n, prev);
}
++itr;
}
++itr;
if (itr != group[p].end()) {
int nxt = (*itr);
if (toRight[x] > nxt) {
toRight[x] = nxt;
update(1, 1, n, x);
}
}
}
}
void Del(int x, int n, vector<vector<int>> &pfactor, vector<set<int>> &group) {
vector<int>wait;
for (int p : pfactor[x]) {
auto itr = group[p].find(x);
if (itr != group[p].begin()) {
--itr;
wait.eb((*itr));
++itr;
}
group[p].erase(itr);
}
for (int w : wait) {
toRight[w] = oo;
for (int p : pfactor[w]) {
auto itr = group[p].find(w);
++itr;
if (itr != group[p].end()) {
toRight[w] = min(toRight[w], (*itr));
}
}
update(1, 1, n, w);
}
toRight[x] = oo;
update(1, 1, n, x);
}
void solve() {
int n, q;
cin >> n >> q;
init(n);
vector<vector<int>> pfactor(n + 1);
vector<bool>state(n + 1, false);
vector<set<int>>group(n + 1);
sieve(n, pfactor);
char type;
int l, r;
while (q--) {
cin >> type >> l;
if (type == 'S') {
if (state[l]) {
Del(l, n, pfactor, group);
state[l] = false;
} else {
Add(l, n, pfactor, group);
state[l] = true;
}
} else {
cin >> r;
if (getMin(1, 1, n, l, r) <= r) {
cout << "DA\n";
} else {
cout << "NE\n";
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |