func_code_string: #include <bits/stdc++.h>   using namespace std;   long long offset[1000];   vector<pair<long long, int> > x[1000];   long long v[500005];   int bucketsize = 700;   inline int bucket(int x) { return x / bucketsize; }   int buckets, n;   inline int bstart(int x) {     if (x == buckets + 1) {       return n + 1;     }     return x * bucketsize;   }   void resort(int buc) {     x[buc].clear();     int l = bstart(buc), r = bstart(buc + 1);     for (int j = l; j < r; j++) {       x[buc].push_back({v[j], j});     }     sort(x[buc].begin(), x[buc].end());   }   int main() {     int q;     scanf( %d %d , &n, &q);     buckets = bucket(n);     for (int i = 1; i <= n; i++) {       int k;       scanf( %d , &k);       v[i] = k;       x[bucket(i)].push_back({v[i], i});     }     for (int i = 0; i <= buckets; i++) {       resort(i);     }     for (int qq = 0; qq < q; qq++) {       int t;       scanf( %d , &t);       if (t == 1) {         int l, r, dd;         scanf( %d %d %d , &l, &r, &dd);         long long d = dd;         int lbucket0 = bucket(l);         int lbucket1 = lbucket0 + 1;         int rbucket = bucket(r);         int lstart1 = bstart(lbucket1);         for (int j = lbucket1; j < rbucket; j++) {           offset[j] += d;         }         if (lbucket0 == rbucket) {           for (int j = l; j <= r; j++) v[j] += d;           resort(lbucket0);         } else {           for (int j = l; j < lstart1; j++) v[j] += d;           for (int j = bstart(rbucket); j <= r; j++) v[j] += d;           resort(lbucket0);           resort(rbucket);         }       } else {         int yy;         scanf( %d , &yy);         long long y = yy;         vector<pair<long long, int> >::iterator it;         int l = 0, r = -1;         for (int i = 0; i <= buckets; i++) {           if (y - offset[i] <= 0) continue;           pair<long long, int> search = {y - offset[i], 0};           it = lower_bound(x[i].begin(), x[i].end(), search);           if (it == x[i].end()) continue;           if (it->first == y - offset[i]) {             l = it->second;             break;           }         }         for (int i = buckets; i >= 0; i--) {           if (y - offset[i] <= 0) continue;           pair<long long, int> search = {y - offset[i] + 1, 0};           it = lower_bound(x[i].begin(), x[i].end(), search);           if (it == x[i].begin()) continue;           it--;           if (it->first == y - offset[i]) {             r = it->second;             break;           }         }         printf( %d n , r - l);       }     }     return 0;   }   