#include <bits/stdc++.h>
using namespace std;
const int _ = 1e5 + 7;
const int __ = 4e5 + 7;
const int L = 11;
int n, Q;
long long a[_], pw[L + 7];
namespace SGT {
long long num[__], minx[__], tag[__];
bool cov[__];
bool flag;
void Build(int k, int l, int r) {
  if (l == r) {
    int j = 0;
    while (pw[j] < a[l]) ++j;
    minx[k] = pw[j] - a[l], num[k] = a[l];
    return;
  }
  Build((k << 1), l, ((l + r) >> 1));
  Build((k << 1 | 1), ((l + r) >> 1) + 1, r);
  minx[k] = min(minx[(k << 1)], minx[(k << 1 | 1)]);
  num[k] =
      minx[(k << 1)] < minx[(k << 1 | 1)] ? num[(k << 1)] : num[(k << 1 | 1)];
}
void upd(int k, long long w) { minx[k] -= w, num[k] += w, tag[k] += w; }
void Psd(int k) {
  if (cov[k]) {
    cov[(k << 1)] = 1, num[(k << 1)] = num[k], minx[(k << 1)] = minx[k];
    cov[(k << 1 | 1)] = 1, num[(k << 1 | 1)] = num[k],
                  minx[(k << 1 | 1)] = minx[k];
    cov[k] = 0, tag[k] = 0;
  } else if (tag[k]) {
    upd((k << 1), tag[k]);
    upd((k << 1 | 1), tag[k]);
    tag[k] = 0;
  }
}
void Modify(int k, int l, int r, int x, int y, int w) {
  if (l >= x and r <= y) {
    if (minx[k] > w) {
      upd(k, w);
      return;
    } else if (l == r or cov[k]) {
      num[k] += w;
      int j = 1;
      while (pw[j] < num[k]) ++j;
      minx[k] = pw[j] - num[k];
      if (!minx[k]) flag = 1;
      return;
    }
  }
  Psd(k);
  if (x <= ((l + r) >> 1)) Modify((k << 1), l, ((l + r) >> 1), x, y, w);
  if (y > ((l + r) >> 1)) Modify((k << 1 | 1), ((l + r) >> 1) + 1, r, x, y, w);
  minx[k] = min(minx[(k << 1)], minx[(k << 1 | 1)]);
  num[k] =
      minx[(k << 1)] < minx[(k << 1 | 1)] ? num[(k << 1)] : num[(k << 1 | 1)];
}
void Cover(int k, int l, int r, int x, int y, int w) {
  if (l >= x and r <= y) {
    tag[k] = 0, num[k] = w, cov[k] = 1;
    int j = 1;
    while (pw[j] < w) ++j;
    minx[k] = pw[j] - w;
    return;
  }
  Psd(k);
  if (x <= ((l + r) >> 1)) Cover((k << 1), l, ((l + r) >> 1), x, y, w);
  if (y > ((l + r) >> 1)) Cover((k << 1 | 1), ((l + r) >> 1) + 1, r, x, y, w);
  minx[k] = min(minx[(k << 1)], minx[(k << 1 | 1)]);
  num[k] =
      minx[(k << 1)] < minx[(k << 1 | 1)] ? num[(k << 1)] : num[(k << 1 | 1)];
}
long long Query(int k, int l, int r, int x) {
  if (l == r) return num[k];
  Psd(k);
  if (x <= ((l + r) >> 1))
    return Query((k << 1), l, ((l + r) >> 1), x);
  else
    return Query((k << 1 | 1), ((l + r) >> 1) + 1, r, x);
}
void Init() { Build(1, 1, n); }
void Add(int l, int r, int w) {
  do {
    flag = 0;
    Modify(1, 1, n, l, r, w);
  } while (flag);
}
void Cover(int l, int r, int w) { Cover(1, 1, n, l, r, w); }
long long Ask(int x) { return Query(1, 1, n, x); }
}  // namespace SGT
int gi() {
  int x = 0;
  char c = getchar();
  while (!isdigit(c)) c = getchar();
  while (isdigit(c)) x = (x << 3) + (x << 1) + c - '0', c = getchar();
  return x;
}
void Init() {
  n = gi(), Q = gi();
  for (int i = 1; i <= n; ++i) a[i] = gi();
  pw[0] = 1;
  for (int i = 1; i <= L; ++i) pw[i] = (long long)pw[i - 1] * 42;
  SGT::Init();
}
void Run() {
  int ty, l, r, x;
  while (Q--) {
    ty = gi();
    if (ty == 1)
      printf("%lld\n", SGT::Ask(gi()));
    else {
      l = gi(), r = gi(), x = gi();
      if (ty == 2)
        SGT::Cover(l, r, x);
      else
        SGT::Add(l, r, x);
    }
  }
}
int main() {
  Init();
  Run();
  return 0;
}
