#include <bits/stdc++.h>
using namespace std;
long long IN() {
  int c, f;
  long long x;
  while (!isdigit(c = getchar()) && c != '-')
    ;
  c == '-' ? (f = 1, x = 0) : (f = 0, x = c - '0');
  while (isdigit(c = getchar())) x = (x << 1) + (x << 3) + c - '0';
  return !f ? x : -x;
}
void Output(long long x) {
  if (x >= 10) Output(x / 10);
  putchar(x % 10 + '0');
}
const int N = 100000 + 19;
long long B[N], ans[N], plu[N];
int D[N], A[N];
int n, q, x, y, z;
multiset<long long> S[N], mn, mx;
void Modify(int x, long long v) {
  int y = A[x];
  long long pmn = *S[y].begin(), pmx = *--S[y].end();
  S[y].erase(S[y].find(ans[x]));
  ans[x] += v;
  S[y].insert(ans[x]);
  if (pmn != *S[y].begin()) {
    mn.erase(mn.find(pmn + plu[y]));
    mn.insert(*S[y].begin() + plu[y]);
  }
  if (pmx != *--S[y].end()) {
    mx.erase(mx.find(pmx + plu[y]));
    mx.insert(*--S[y].end() + plu[y]);
  }
}
void Add(int x, long long v) {
  Modify(A[x], v);
  Modify(x, v);
  if (!S[x].empty()) {
    mn.erase(mn.find(*S[x].begin() + plu[x]));
    mx.erase(mx.find(*--S[x].end() + plu[x]));
  }
  plu[x] += v;
  if (!S[x].empty()) {
    mn.insert(*S[x].begin() + plu[x]);
    mx.insert(*--S[x].end() + plu[x]);
  }
}
void Cut(int x, int y) {
  mn.erase(mn.find(*S[y].begin() + plu[y]));
  mx.erase(mx.find(*--S[y].end() + plu[y]));
  S[y].erase(S[y].find(ans[x]));
  ans[x] += plu[y];
  if (!S[y].empty()) {
    mn.insert(*S[y].begin() + plu[y]);
    mx.insert(*--S[y].end() + plu[y]);
  }
}
void Link(int x, int y) {
  if (!S[y].empty()) {
    mn.erase(mn.find(*S[y].begin() + plu[y]));
    mx.erase(mx.find(*--S[y].end() + plu[y]));
  }
  ans[x] -= plu[y];
  S[y].insert(ans[x]);
  A[x] = y;
  mn.insert(*S[y].begin() + plu[y]);
  mx.insert(*--S[y].end() + plu[y]);
}
int main() {
  n = IN(), q = IN();
  for (int i = 1; i < n + 1; i++) B[i] = IN();
  for (int i = 1; i < n + 1; i++) {
    A[i] = IN();
    D[i]++;
    D[i]++;
    D[A[i]]++;
  }
  for (int i = 1; i < n + 1; i++) {
    ans[i] += B[i] / D[i] + B[i] % D[i];
    ans[A[i]] += B[i] / D[i];
    ans[i] += B[A[i]] / D[A[i]];
  }
  for (int i = 1; i < n + 1; i++) {
    S[A[i]].insert(ans[i]);
  }
  for (int i = 1; i < n + 1; i++)
    if (!S[i].empty()) {
      mn.insert(*S[i].begin());
      mx.insert(*--S[i].end());
    }
  while (q--) {
    int o = IN();
    if (o == 1) {
      x = IN(), y = A[x], z = IN();
      Add(x, -B[x] / D[x]);
      Add(y, -B[y] / D[y]);
      Add(z, -B[z] / D[z]);
      Modify(y, -B[y] % D[y] + B[y] % (D[y] - 1));
      D[y]--;
      Modify(z, -B[z] % D[z] + B[z] % (D[z] + 1));
      D[z]++;
      Cut(x, y);
      Link(x, z);
      Add(x, B[x] / D[x]);
      Add(y, B[y] / D[y]);
      Add(z, B[z] / D[z]);
    }
    if (o == 2) {
      x = IN();
      Output(ans[x] + plu[A[x]]);
      puts("");
    }
    if (o == 3) {
      Output(*mn.begin());
      putchar(' ');
      Output(*--mx.end());
      puts("");
    }
  }
}
