#include <algorithm>
#include <bitset>
#include <iostream>
#include <limits>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define ull unsigned long long
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m;
cin >> n >> m;
vector<pair<int, int>> r(m);
for (int i = 0; i < m; i++) {
cin >> r[i].first >> r[i].second;
r[i].first--;
r[i].second--;
}
for (int i = 1; i <= n; i++) {
map<int, set<ull>> pos; // possible configurations
for (int j = 0; j <= n - i; j++) {
bitset<35> act;
for (int k = 0; k < i; k++) {
act.set(j + k);
}
for (int k = 0; k < i; k++) {
pos[j + k].insert(act.to_ullong());
}
}
for (int k = m - 1; k >= 0; k--) {
auto& fromSet = pos[r[k].first];
auto& toSet = pos[r[k].second];
vector<ull> toDeleteTmp;
set_difference(fromSet.begin(), fromSet.end(), toSet.begin(),
toSet.end(), back_inserter(toDeleteTmp));
vector<ull> toAddTmp;
set_difference(toSet.begin(), toSet.end(), fromSet.begin(),
fromSet.end(), back_inserter(toAddTmp));
for (auto& add : toAddTmp) {
add = add ^ (1ull << r[k].first) ^ (1ull << r[k].second);
}
vector<ull> toDelete;
set_difference(toDeleteTmp.begin(), toDeleteTmp.end(),
toAddTmp.begin(), toAddTmp.end(),
back_inserter(toDelete));
for (auto it : toDelete) {
for (ull i = 0; i < 35; i++) {
if (it & (1ull << i)) {
pos[i].erase(it);
}
}
}
vector<ull> toAdd;
set_difference(toAddTmp.begin(), toAddTmp.end(),
toDeleteTmp.begin(), toDeleteTmp.end(),
back_inserter(toAdd));
for (auto it : toAdd) {
for (int i = 0; i < 35; i++) {
if (it & (1ull << i)) {
pos[i].insert(it);
}
}
}
}
set<ull> all;
for (auto& [_, v] : pos) {
all.insert(v.begin(), v.end());
}
cout << all.size() % 2 << ' ' << flush;
}
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 | #include <algorithm> #include <bitset> #include <iostream> #include <limits> #include <map> #include <set> #include <vector> using namespace std; #define ull unsigned long long int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, m; cin >> n >> m; vector<pair<int, int>> r(m); for (int i = 0; i < m; i++) { cin >> r[i].first >> r[i].second; r[i].first--; r[i].second--; } for (int i = 1; i <= n; i++) { map<int, set<ull>> pos; // possible configurations for (int j = 0; j <= n - i; j++) { bitset<35> act; for (int k = 0; k < i; k++) { act.set(j + k); } for (int k = 0; k < i; k++) { pos[j + k].insert(act.to_ullong()); } } for (int k = m - 1; k >= 0; k--) { auto& fromSet = pos[r[k].first]; auto& toSet = pos[r[k].second]; vector<ull> toDeleteTmp; set_difference(fromSet.begin(), fromSet.end(), toSet.begin(), toSet.end(), back_inserter(toDeleteTmp)); vector<ull> toAddTmp; set_difference(toSet.begin(), toSet.end(), fromSet.begin(), fromSet.end(), back_inserter(toAddTmp)); for (auto& add : toAddTmp) { add = add ^ (1ull << r[k].first) ^ (1ull << r[k].second); } vector<ull> toDelete; set_difference(toDeleteTmp.begin(), toDeleteTmp.end(), toAddTmp.begin(), toAddTmp.end(), back_inserter(toDelete)); for (auto it : toDelete) { for (ull i = 0; i < 35; i++) { if (it & (1ull << i)) { pos[i].erase(it); } } } vector<ull> toAdd; set_difference(toAddTmp.begin(), toAddTmp.end(), toDeleteTmp.begin(), toDeleteTmp.end(), back_inserter(toAdd)); for (auto it : toAdd) { for (int i = 0; i < 35; i++) { if (it & (1ull << i)) { pos[i].insert(it); } } } } set<ull> all; for (auto& [_, v] : pos) { all.insert(v.begin(), v.end()); } cout << all.size() % 2 << ' ' << flush; } return 0; } |
English