This documentation is automatically generated by online-judge-tools/verification-helper
View the Project on GitHub shibh308/library
#define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0425" #include <bits/stdc++.h> using namespace std; using i64 = long long; const i64 MOD = 1e9 + 7; const i64 INF = i64(1e18) + 7; template <typename T> bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } template <typename T> bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } #include "../lib/classes/mo.cpp" #include "../lib/functions/mo_query.cpp" signed main(){ int n, k, q; cin >> n >> k >> q; vector<int> a(k), b(k); for(int i = 0; i < k; ++i){ cin >> a[i] >> b[i]; --a[i], --b[i]; } vector<pair<int,int>> queries; vector<int> type(q), s(q), t(q), x(q); for(int i = 0; i < q; ++i){ cin >> type[i] >> s[i] >> t[i] >> x[i]; --s[i], --x[i]; queries.emplace_back(s[i], t[i]); } vector<int> data(n), idxes(n); iota(data.begin(), data.end(), 0); iota(idxes.begin(), idxes.end(), 0); auto right_f = [&](int idx){ if(idx >= k) return; swap(data[a[idx]], data[b[idx]]); idxes[data[a[idx]]] = a[idx]; idxes[data[b[idx]]] = b[idx]; }; auto left_f = [&](int idx){ if(idx >= k) return; swap(data[idxes[a[idx]]], data[idxes[b[idx]]]); int idx_1 = idxes[a[idx]]; int data_idx_1 = data[idx_1]; int idx_2 = idxes[b[idx]]; int data_idx_2 = data[idx_2]; idxes[data_idx_1] = idx_1; idxes[data_idx_2] = idx_2; }; Mo mo(left_f, left_f, right_f, right_f); auto ans = mo_query<int>(mo, queries, [&](int idx){return type[idx] == 1 ? data[x[idx]] : idxes[x[idx]];}); for(int i = 0; i < q; ++i) cout << ans[i] + 1 << endl; return 0; }
#line 1 "verify/mo_query.test.cpp" #define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0425" #include <bits/stdc++.h> using namespace std; using i64 = long long; const i64 MOD = 1e9 + 7; const i64 INF = i64(1e18) + 7; template <typename T> bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } template <typename T> bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } #line 1 "lib/classes/mo.cpp" struct Mo{ int l, r; function<void(int)> left_add, left_erase, right_add, right_erase; Mo(function<void(int)> left_add, function<void(int)> left_erase, function<void(int)> right_add, function<void(int)> right_erase, int sl = 0, int sr = 0) : l(sl), r(sr), left_add(left_add), left_erase(left_erase), right_add(right_add), right_erase(right_erase){} void move(int next_l, int next_r){ for(int i = l; i < next_l; ++i) left_erase(i); for(int i = l - 1; i >= next_l; --i) left_add(i); for(int i = r; i < next_r; ++i) right_add(i); for(int i = r - 1; i >= next_r; --i) right_erase(i); l = next_l, r = next_r; } }; #line 1 "lib/functions/mo_query.cpp" template <typename ResultType> vector<ResultType> mo_query(Mo& mo, vector<pair<int,int>>& queries, function<ResultType(int)> get_func, int packet=512){ int q = queries.size(); vector<tuple<int,int,int>> sort_queries; for(int i = 0; i < q; ++i) sort_queries.emplace_back(queries[i].first / packet, queries[i].second, i); sort(sort_queries.begin(), sort_queries.end()); vector<ResultType> ans(q); for(auto& query : sort_queries){ int idx = get<2>(query); mo.move(queries[idx].first, queries[idx].second); ans[idx] = get_func(idx); } return ans; } #line 32 "verify/mo_query.test.cpp" signed main(){ int n, k, q; cin >> n >> k >> q; vector<int> a(k), b(k); for(int i = 0; i < k; ++i){ cin >> a[i] >> b[i]; --a[i], --b[i]; } vector<pair<int,int>> queries; vector<int> type(q), s(q), t(q), x(q); for(int i = 0; i < q; ++i){ cin >> type[i] >> s[i] >> t[i] >> x[i]; --s[i], --x[i]; queries.emplace_back(s[i], t[i]); } vector<int> data(n), idxes(n); iota(data.begin(), data.end(), 0); iota(idxes.begin(), idxes.end(), 0); auto right_f = [&](int idx){ if(idx >= k) return; swap(data[a[idx]], data[b[idx]]); idxes[data[a[idx]]] = a[idx]; idxes[data[b[idx]]] = b[idx]; }; auto left_f = [&](int idx){ if(idx >= k) return; swap(data[idxes[a[idx]]], data[idxes[b[idx]]]); int idx_1 = idxes[a[idx]]; int data_idx_1 = data[idx_1]; int idx_2 = idxes[b[idx]]; int data_idx_2 = data[idx_2]; idxes[data_idx_1] = idx_1; idxes[data_idx_2] = idx_2; }; Mo mo(left_f, left_f, right_f, right_f); auto ans = mo_query<int>(mo, queries, [&](int idx){return type[idx] == 1 ? data[x[idx]] : idxes[x[idx]];}); for(int i = 0; i < q; ++i) cout << ans[i] + 1 << endl; return 0; }