Guest User

Untitled

a guest
Dec 11th, 2018
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.77 KB | None | 0 0
  1. #ifdef LOCAL
  2. //#include "rang.hpp"
  3. //using namespace rang;
  4. #endif
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7.  
  8. #define fast_read ios::sync_with_stdio(false); cin.tie(nullptr);
  9. #ifdef LOCAL
  10. #define see(x) cout <<"<DBG> " << #x << ": " << (x) << endl
  11. #endif
  12. #ifndef LOCAL
  13. #define see(x)
  14. #endif
  15.  
  16. template<typename T> void dprintln(const T &t) { cout << t << endl; } // for debug use
  17. template<typename T, typename ...Args> void dprintln(const T &t, const Args &...rest) { cout << t << ' '; dprintln(rest...); }
  18. template<typename T> void println(const T &t) { cout << t << '\n'; }
  19. template<typename T, typename ...Args> void println(const T &t, const Args &...rest) { cout << t << ' '; println(rest...); }
  20.  
  21. template<typename T> void print(const T &t) { cout << t << ' '; }
  22.  
  23. template<typename T, typename ...Args> void print(const T &t, const Args &...rest) { cout << t; print(rest...); }
  24.  
  25. // this overload is chosen when there's only one argument
  26. template<class T> void scan(T &t) { cin >> t; }
  27. template<class T, class ...Args> void scan(T &a, Args &...rest) { cin >> a; scan(rest...); }
  28. using ll = long long;
  29. using vl = vector<ll>;
  30. using vi = vector<int>;
  31. using pii = pair<int,int>;
  32. using vb = vector<bool>;
  33. using vpii = vector<pii>;
  34.  
  35. #define rng(i, a, b) for(int i = (a); i < (b); ++i)
  36. #define dwn(i, b, a) for (int i = (b); i >= (a); i--)
  37. #define rep(n) for(int _ = 0, __ = (int)n; _ < __; _++)
  38. #define stp(i, a, b, c) for (int i = (a); i < (b); i += (c))
  39. #define FOR(x, cont) for (auto &x: cont)
  40. #define all(x) begin(x), end(x)
  41. #define pb push_back
  42. #define mp make_pair
  43. #define eb emplace_back
  44. #define SZ(x) (int)(x).size()
  45. #define pq(T,COMP) priority_queue<T, vector<T>, COMP>
  46. #define popcnt(x) __builtin_popcount((x))
  47. #define SET(arr, v) memset(arr, (v), sizeof (arr))
  48. #define UNIQ(vec) (vec).erase(unique(all(vec)), end(vec))
  49. //auto bet = [](const ll x, const ll y, const ll i) {
  50. // return x <= i && i <= y;
  51. //};
  52. //inline int h_bit(unsigned int x) {
  53. // return 31 - __builtin_clz(x);
  54. //}
  55. //inline int h_bitll(unsigned long long x) {
  56. // return 63 - __builtin_clzll(x);
  57. //}
  58. //
  59. //struct frac{
  60. // using ll = long long;
  61. // ll fz, fm;
  62. // frac() = default;
  63. //
  64. // frac(ll fz, ll fm) { // 构造函数变量名最好不要跟类成员名一样!
  65. // assert(fm != 0);
  66. // if (fm < 0) fm *= -1, fz *= -1;
  67. // ll g = __gcd(abs(fz), fm);
  68. // fz /= g, fm /= g;
  69. // this->fz = fz, this->fm = fm;
  70. // }
  71. //
  72. // frac(ll x):fz(x),fm(1){} // implicit conversion
  73. //
  74. // frac operator*(const frac &other)const{
  75. // return {fz * other.fz, fm * other.fm};
  76. // }
  77. //
  78. // frac operator-()const{
  79. // return {-fz, fm};
  80. // }
  81. // frac operator-(const frac &other)const{
  82. // return *this + (-other);
  83. // }
  84. // frac operator+(const frac &other)const{
  85. // ll _fz = fz * other.fm + fm * other.fz;
  86. // ll _fm = fm * other.fm;
  87. // return {_fz, _fm};
  88. // }
  89. // bool operator==(const frac &other)const{
  90. // return other.fz == fz && other.fm == fm;
  91. // }
  92. // bool operator<(const frac &other)const{
  93. // return fz * other.fm < other.fz * fm;
  94. // }
  95. // bool operator>(const frac &other)const{
  96. // return fz * other.fm > other.fz * fm;
  97. // }
  98. // bool operator>=(const frac &other)const{
  99. // return !(*this < other);
  100. // }
  101. // bool operator<=(const frac &other)const{
  102. // return !(*this > other);
  103. // }
  104. // frac operator/(const int &x)const{
  105. // return {fz, fm * x};
  106. // }
  107. // double to_double() const {
  108. // return fz / (double)fm;
  109. // }
  110. //
  111. //};
  112.  
  113. template <typename T>
  114. struct bit {
  115. vector<T> a;
  116. explicit bit(int n, int v = 0) {
  117. a.resize(n + 1);
  118. if(v != 0) {
  119. for (int i = 1; i <= n; ++i) a[i] = v;
  120. }
  121. }
  122.  
  123. T sum(T x) {
  124. T res = 0;
  125. while (x) {
  126. res += a[x];
  127. x -= x & -x;
  128. }
  129. return res;
  130. }
  131.  
  132. T sum(int l, int r) {
  133. if (l > r) return 0;
  134. return sum(r) - sum(l - 1);
  135. }
  136.  
  137. void add(int x, T v) {
  138. while (x < a.size()) {
  139. a[x] += v;
  140. x += x & -x;
  141. }
  142. }
  143. void clear(){
  144. fill(a.begin(), a.end(), 0);
  145. }
  146. };
  147. vi get_prime(int n) {
  148. vi minp(n + 1), p;
  149. for (int i = 2; i <= n; i++) {
  150. if (!minp[i]) {
  151. minp[i] = i;
  152. p.pb(i);
  153. }
  154. FOR(x, p) {
  155. if (x <= minp[i] && x * i <= n)
  156. minp[x * i] = x;
  157. else break;
  158. }
  159. }
  160. return p;
  161. }
  162.  
  163. const int mod = 1000000007;
  164.  
  165. inline void add_mod(ll &x, const ll &y) {
  166. x += y;
  167. if (x >= mod) x -= mod;
  168. }
  169. void sub_mod(ll &x, const ll &y) {
  170. x -= y;
  171. if (x < 0) x += mod;
  172. }
  173. // alias templates
  174. template<typename T> using vv = vector<vector<T>>;
  175. template <typename T1, typename T2 = T1> using vp = vector<pair<T1,T2>>;
  176. template<typename T, int n> using va = vector<array<T,n>>;
  177.  
  178.  
  179. using vec = vector<ll>;
  180. using mat = vector<vec>;
  181. mat get_I(int n) {
  182. mat res(n, vec(n));
  183. for (int i = 0; i < n; i++)
  184. res[i][i] = 1;
  185. return res;
  186. }
  187.  
  188. mat operator*(const mat &a, const mat &b) {
  189. mat c(a.size(), vec(b[0].size()));
  190. for (size_t i = 0; i < a.size(); i++) {
  191. for (size_t j = 0; j < a[0].size(); j++) {
  192. if (a[i][j]) { // optimization for sparse matrix
  193. for (size_t k = 0; k < b[0].size(); k++) {
  194. add_mod(c[i][k], a[i][j] * b[j][k] % mod);
  195. }
  196. }
  197. }
  198. }
  199. return c;
  200. }
  201.  
  202. vec operator*(const mat &a, const vec &b) {
  203. vec c(a.size());
  204. for (size_t i = 0; i < a.size(); i++) {
  205. for (size_t j = 0; j < a[0].size(); j++) {
  206. add_mod(c[i], a[i][j] * b[j] % mod);
  207. }
  208. }
  209. return c;
  210. }
  211.  
  212. mat pow(mat a, ll n) {
  213. mat res(a.size(), vec(a[0].size()));
  214. for (size_t i = 0; i < a.size(); i++) {
  215. res[i][i] = 1;
  216. }
  217. while (n) {
  218. if (n & 1) {
  219. res = res * a;
  220. }
  221. a = a * a;
  222. n >>= 1;
  223. }
  224. return res;
  225. }
  226. //union-find 并查集
  227. struct UF{
  228. vi par;
  229. explicit UF(int n) {
  230. par.assign(n + 1, 0);
  231. rng (i, 1, n + 1) par[i] = i;
  232. }
  233. int find(int x) {
  234. return x == par[x] ? x : par[x] = find(par[x]);
  235. }
  236. void unite(int x, int y) {
  237. par[find(x)] = find(y);
  238. }
  239. };
  240.  
  241.  
  242. vi get_popcnt(int n) {
  243. vi res(n + 1);
  244. rng (i, 0, n) {
  245. if (i * 2 <= n) res[i * 2] = res[i];
  246. if ((i & 1) == 0) res[i + 1] = res[i] + 1;
  247. }
  248. return res;
  249. }
  250.  
  251. /**** SUPER MACROs ****/
  252. #define FAIL {println("NO"); return 0;}
  253. const int N = 2e5+5, M = 1005;
  254.  
  255. vv<int> g(N);
  256.  
  257. int fa[N][18];
  258. int dep[N];
  259. void dfs(int u, int f) {
  260. fa[u][0] = f;
  261. dep[u] = dep[f] + 1;
  262. rng (i, 1, 18) {
  263. fa[u][i] = fa[fa[u][i-1]][i-1];
  264. }
  265. FOR(v, g[u]) if(v!=f) {
  266. dfs(v, u);
  267. }
  268. }
  269.  
  270. int lca(int u, int v){
  271. if (dep[u] < dep[v]) swap(u, v);
  272. int dif = dep[u] - dep[v];
  273. rng(i, 0, 18) {
  274. if (dif & 1 << i) {
  275. u = fa[u][i];
  276. }
  277. }
  278. if (u == v) return u;
  279. dwn(i, 17, 0) {
  280. if (fa[u][i] != fa[v][i]) {
  281. u = fa[u][i];
  282. v = fa[v][i];
  283. }
  284. }
  285. return fa[u][0];
  286. }
  287.  
  288.  
  289. vi check(int a, int b, int c, int d) {
  290. if (a == 0 && b == 0) return {c, d};
  291. int x[4] = {a, b, c, d};
  292. rng(i, 0, 3) rng(j, i+1, 4) {
  293. int u = lca(x[i], x[j]);
  294. vi ans;
  295. rng(k, 0, 4) {
  296. if (k != i && k != j) {
  297. int t = x[k];
  298. if (lca(t, u) == u && (lca(t, x[i]) == t || lca(t, x[j]) == t)) {
  299. ans.pb(t);
  300. } else break;
  301. }
  302. }
  303. if (SZ(ans) == 2) {
  304. return ans;
  305. }
  306. }
  307. return {-1,-1};
  308. }
  309.  
  310. struct node{
  311. bool ok;
  312. int u, v;
  313. }tree[N*4];
  314.  
  315. int leaf[N];
  316. int p[N];
  317. int v[N]; // 值所在的节点编号
  318.  
  319. void push_up(int id){
  320. auto & f = tree[id], lson = tree[id * 2], rson = tree[id * 2 + 1];
  321. if (lson.ok && rson.ok) {
  322. auto res = check(lson.u, lson.v, rson.u, rson.v);
  323. if (res[0] != -1) {
  324. f.ok = true;
  325. f.u = res[0];
  326. f.v = res[1];
  327. }
  328. }
  329. }
  330.  
  331. void build(int id, int l, int r) {
  332. if (l == r) {
  333. leaf[l] = id;
  334. tree[id].u = tree[id].v = v[l];
  335. tree[id].ok = true;
  336. return;
  337. }
  338. int mid = (l + r) / 2;
  339. build(id * 2, l, mid);
  340. build(id * 2 + 1, mid + 1, r);
  341. push_up(id);
  342. }
  343.  
  344.  
  345. void work(int i) {
  346. int id = leaf[p[i]];
  347. tree[id].u = tree[id].v = i;
  348. while(id != 1){
  349. id /= 2;
  350. push_up(id);
  351. }
  352. }
  353.  
  354. void upd(int i, int j) {
  355. swap(p[i], p[j]);
  356. work(i);
  357. work(j);
  358. }
  359.  
  360. int query(int id, int l, int r, int u, int v) {
  361. if (tree[id].ok) {
  362. auto t = check(u, v, tree[id].u, tree[id].v);
  363. if (t[0] != -1) return r - l + 1;
  364. if (l == r) return 0;
  365. }
  366.  
  367. int mid = (l + r) / 2;
  368. auto &lson = tree[id * 2];
  369. if (lson.ok) {
  370. auto t = check(u, v, lson.u, lson.v);
  371. if (t[0] != -1) {
  372. return mid - l + 1 + query(id * 2 + 1, mid + 1, r, t[0], t[1]);
  373. }
  374. }
  375. return query(id * 2 + 1, l, mid, u, v);
  376. }
  377.  
  378. int main() {
  379. fast_read
  380. #ifdef LOCAL
  381. freopen("main.in", "r", stdin);
  382. // ifstream in("main.in");
  383. // auto cinbuf = std::cin.rdbuf(in.rdbuf()); //C++ style
  384. // freopen("main.out", "w", stdout);
  385. #endif
  386.  
  387. int n; cin >> n;
  388. vi p(n+1); rng(i, 1, n+1) cin >> p[i], v[p[i]] = i;
  389. rng(i, 2, n + 1) {
  390. int x; cin >> x;
  391. g[x].pb(i);
  392. g[i].pb(x);
  393. }
  394.  
  395. build(1, 0, n);
  396.  
  397. dfs(1, 1);
  398. int q; cin >> q;
  399. rep(q) {
  400. int t, i, j;
  401. scan(t);
  402. if (t == 1) {
  403. scan(i, j);
  404. upd(i, j);
  405. }
  406. else {
  407. println(query(1, 0, n, 0, 0));
  408. }
  409. }
  410.  
  411.  
  412. #ifdef LOCAL
  413. cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  414. // cin.rdbuf(cinbuf);
  415. // system("PAUSE");
  416. #endif
  417. return 0;
  418. }
Add Comment
Please, Sign In to add comment