#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
struct Wlot {
static const int B = 1 << 20;
int p = 0, l = 0;
char buf[B];
inline char mniam() {
if (p >= l) {
l = fread(buf, 1, B, stdin);
p = 0;
if (!l) return 0;
}
return buf[p++];
}
template <class T>
bool dawaj(T &x) {
char c = mniam();
if (!c) return false;
while (c <= ' ') {
c = mniam();
if (!c) return false;
}
x = 0;
while (c > ' ') {
x = x * 10 + (c - '0');
c = mniam();
}
return true;
}
};
int main() {
Wlot hehe;
int n, m, q;
if (!hehe.dawaj(n)) return 0;
hehe.dawaj(m);
hehe.dawaj(q);
int klocki = (n + 63) >> 6;
ull czapka = (n & 63) ? ((1ULL << (n & 63)) - 1) : ~0ULL;
size_t wszystko = 1ULL * (n + m + 1) * klocki;
ull *kisiel = (ull *)calloc(wszystko, sizeof(ull));
if (!kisiel) return 0;
for (int jajo = 1; jajo <= n; jajo++) {
ull *placki = kisiel + 1ULL * jajo * klocki;
for (int bongo = jajo; bongo <= n; bongo += jajo) {
placki[(bongo - 1) >> 6] |= 1ULL << ((bongo - 1) & 63);
}
}
for (int i = 1; i <= m; i++) {
int typ, x, y;
hehe.dawaj(typ);
ull *nowe = kisiel + 1ULL * (n + i) * klocki;
if (typ == 1) {
hehe.dawaj(x);
hehe.dawaj(y);
ull *lelo = kisiel + 1ULL * x * klocki;
ull *bolo = kisiel + 1ULL * y * klocki;
for (int glonojad = 0; glonojad < klocki; glonojad++) {
nowe[glonojad] = lelo[glonojad] | bolo[glonojad];
}
} else if (typ == 2) {
hehe.dawaj(x);
hehe.dawaj(y);
ull *lelo = kisiel + 1ULL * x * klocki;
ull *bolo = kisiel + 1ULL * y * klocki;
for (int glonojad = 0; glonojad < klocki; glonojad++) {
nowe[glonojad] = lelo[glonojad] & bolo[glonojad];
}
} else {
hehe.dawaj(x);
ull *lelo = kisiel + 1ULL * x * klocki;
for (int glonojad = 0; glonojad < klocki; glonojad++) {
nowe[glonojad] = ~lelo[glonojad];
}
nowe[klocki - 1] &= czapka;
}
}
string odpowiedz;
odpowiedz.reserve(5ULL * q);
for (int i = 0; i < q; i++) {
int x, v;
hehe.dawaj(x);
hehe.dawaj(v);
ull pyra = kisiel[1ULL * x * klocki + ((v - 1) >> 6)];
if ((pyra >> ((v - 1) & 63)) & 1ULL) odpowiedz += "TAK\n";
else odpowiedz += "NIE\n";
}
fwrite(odpowiedz.c_str(), 1, odpowiedz.size(), stdout);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | #include <bits/stdc++.h> using namespace std; using ull = unsigned long long; struct Wlot { static const int B = 1 << 20; int p = 0, l = 0; char buf[B]; inline char mniam() { if (p >= l) { l = fread(buf, 1, B, stdin); p = 0; if (!l) return 0; } return buf[p++]; } template <class T> bool dawaj(T &x) { char c = mniam(); if (!c) return false; while (c <= ' ') { c = mniam(); if (!c) return false; } x = 0; while (c > ' ') { x = x * 10 + (c - '0'); c = mniam(); } return true; } }; int main() { Wlot hehe; int n, m, q; if (!hehe.dawaj(n)) return 0; hehe.dawaj(m); hehe.dawaj(q); int klocki = (n + 63) >> 6; ull czapka = (n & 63) ? ((1ULL << (n & 63)) - 1) : ~0ULL; size_t wszystko = 1ULL * (n + m + 1) * klocki; ull *kisiel = (ull *)calloc(wszystko, sizeof(ull)); if (!kisiel) return 0; for (int jajo = 1; jajo <= n; jajo++) { ull *placki = kisiel + 1ULL * jajo * klocki; for (int bongo = jajo; bongo <= n; bongo += jajo) { placki[(bongo - 1) >> 6] |= 1ULL << ((bongo - 1) & 63); } } for (int i = 1; i <= m; i++) { int typ, x, y; hehe.dawaj(typ); ull *nowe = kisiel + 1ULL * (n + i) * klocki; if (typ == 1) { hehe.dawaj(x); hehe.dawaj(y); ull *lelo = kisiel + 1ULL * x * klocki; ull *bolo = kisiel + 1ULL * y * klocki; for (int glonojad = 0; glonojad < klocki; glonojad++) { nowe[glonojad] = lelo[glonojad] | bolo[glonojad]; } } else if (typ == 2) { hehe.dawaj(x); hehe.dawaj(y); ull *lelo = kisiel + 1ULL * x * klocki; ull *bolo = kisiel + 1ULL * y * klocki; for (int glonojad = 0; glonojad < klocki; glonojad++) { nowe[glonojad] = lelo[glonojad] & bolo[glonojad]; } } else { hehe.dawaj(x); ull *lelo = kisiel + 1ULL * x * klocki; for (int glonojad = 0; glonojad < klocki; glonojad++) { nowe[glonojad] = ~lelo[glonojad]; } nowe[klocki - 1] &= czapka; } } string odpowiedz; odpowiedz.reserve(5ULL * q); for (int i = 0; i < q; i++) { int x, v; hehe.dawaj(x); hehe.dawaj(v); ull pyra = kisiel[1ULL * x * klocki + ((v - 1) >> 6)]; if ((pyra >> ((v - 1) & 63)) & 1ULL) odpowiedz += "TAK\n"; else odpowiedz += "NIE\n"; } fwrite(odpowiedz.c_str(), 1, odpowiedz.size(), stdout); return 0; } |
English