#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500100;
const int root = 800;
long long lazy[root];
unordered_set<long long> s[root];
long long v[MAXN];
signed main() {
  memset(lazy, 0, sizeof lazy);
  long long n, m;
  scanf("%lld %lld", &n, &m);
  for (long long i = 0; i < n; i++)
    scanf("%lld", &v[i]), s[i / root].insert(v[i]);
  for (long long i = 1; i <= m; i++) {
    long long t;
    scanf("%lld", &t);
    if (t == 1) {
      long long l, r, x;
      scanf("%lld %lld %lld", &l, &r, &x);
      l -= 1, r -= 1;
      s[l / root].clear();
      for (long long j = (l / root) * root; j < min((l / root + 1) * root, n);
           j++) {
        if (j >= l && j <= r) v[j] += x;
        s[l / root].insert(v[j]);
      }
      if (l / root == r / root) continue;
      for (long long j = l / root + 1; j < r / root; j++) {
        lazy[j] += x;
      }
      s[r / root].clear();
      for (long long j = (r / root) * root; j < min((r / root + 1) * root, n);
           j++) {
        if (j <= r && j >= l) v[j] += x;
        s[r / root].insert(v[j]);
      }
    }
    if (t == 2) {
      long long y, ini, fim;
      scanf("%lld", &y);
      bool flag = false;
      for (long long j = 0; j < root; j++) {
        if (s[j].find(y - lazy[j]) != s[j].end()) {
          flag = true;
          for (long long k = j * root; k < (j + 1) * root; k++)
            if (v[k] == y - lazy[j]) {
              ini = k;
              break;
            }
          break;
        }
      }
      if (flag == false) {
        printf("-1\n");
        continue;
      }
      for (long long j = root - 1; j >= 0; j--) {
        if (s[j].find(y - lazy[j]) != s[j].end()) {
          flag = true;
          for (long long k = min((j + 1) * root - 1, n - 1); k >= j * root;
               k--) {
            if (v[k] == y - lazy[j]) {
              fim = k;
              break;
            }
          }
          break;
        }
      }
      printf("%lld\n", fim - ini);
    }
  }
}
