#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;   }