class Solution{
public:
vector segment_tree, v;
int gcd(int a, int b) {
if(a < b) {
swap(a, b);
}
while(b != 0) {
int tmp = a % b;
a = b;
b = tmp;
}
return a;
}
void build(int L, int R, int pos) {
if(L == R) {
segment_tree[pos] = v[L];
}
else {
int mid = (L + R) / 2;
build(L, mid, 2 * pos);
build(mid + 1, R, 2 * pos + 1);
segment_tree[pos] = gcd(segment_tree[2 * pos], segment_tree[2 * pos + 1]);
}
}
int query(int L, int R, int pos, int i, int j) {
// L R i L R j L R
if(i <= L and R <= j) {
return segment_tree[pos];
}
if(R < i or j < L) {
return 0;
}
int mid = (L + R) / 2;
return gcd(query(L, mid, 2 * pos, i, j), query(mid + 1, R, 2 * pos + 1, i, j));
}
int findSmallestSubArr(int arr[], int n, int g) {
int ok = -1;
v.resize(n);
for(int i = 0; i < n; i++) {
if(arr[i] == g) {
return 1;
}
if(arr[i] % g == 0) {
ok = 1;
}
v[i] = arr[i];
}
if(ok == -1) {
return -1;
}
segment_tree.resize(4 * n);
build(0, n - 1, 1);
int res = 2e9;
for(int i = 0; i < n; i++) {
if(v[i] % g == 0) {
int L = i + 1, R = n - 1;
int idx = -1;
while(L <= R) {
int mid = L + (R - L) / 2;
int gcd = query(0, n - 1, 1, i, mid);
if(gcd == g) {
R = mid - 1;
idx = mid;
}
else if(gcd > g) {
L = mid + 1;
}
else {
R = mid - 1;
}
}
if(idx != -1) {
res = min(res, idx - i + 1);
}
}
}
if(res == 2e9) {
res = -1;
}
return res;
}
};