#include #include #include #include using namespace std; const int Max = 100001; int hsh[Max]; int prime[Max]; int Array[50001]; vector< int > Factor[Max]; int Cnt[250][Max]; int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); } vector< int > factorize(int num){ vector< int > res; while(num > 1){ int p = prime[num]; num /= p; if(!hsh[p]) res.push_back(p); hsh[p] = 1; } for(int i = 0 ; i < res.size() ; ++i) hsh[res[i]] = 0; return res; } void pre(){ for(int i = 2 ; i < Max ; ++i) prime[i] = i; for(int i = 2 ; i * i < Max ; ++i) if(prime[i] == i) for(int j = i + i ; j < Max ; j += i) prime[j] = i; for(int i = 2 ; i < Max ; ++i) Factor[i] = factorize(i); } int solve(int index, int num){ int ans = 0; int sz = (int)Factor[num].size(); for(int i = 1 ; i < 1 << sz ; ++i){ int mul = 1; int ct = 0; for(int j = 0 ; j < sz ; ++j){ if(1 << j & i) mul *= Factor[num][j] , ++ct; } if(ct & 1) ans += Cnt[index][mul]; else ans -= Cnt[index][mul]; } return ans; } int query(int id, int sq, int x){ if(!id) return 0; int res = 0; int times = id/sq; for(int i = 0 ; i < times ; ++i) res += solve(i, x); for(int i = id ; i/sq == times && i > 0 ; --i) if(gcd(x, Array[i]) > 1) ++res; return res; } void add(int num, int index, int val){ int sz = (int)Factor[num].size(); for(int i = 1 ; i < 1 << sz ; ++i){ int mul = 1; for(int j = 0 ; j < sz ; ++j){ if(1 << j & i) mul *= Factor[num][j]; } Cnt[index][mul] += val; } } int main(){ pre(); int N, Q; scanf("%d", &N); int sq = sqrt(N); for(int i = 1 ; i <= N ; ++i){ scanf("%d", Array + i); add(Array[i], i/sq, 1); } scanf("%d",&Q); while(Q--){ int type; scanf("%d", &type); if(type == 1){ int id, x; scanf("%d%d", &id, &x); add(Array[id], id/sq, -1); Array[id] = x; add(Array[id], id/sq, 1); } else { int l, r, x; scanf("%d %d %d", &l, &r, &x); int res = r - l + 1 - query(r, sq, x) + query(l - 1, sq, x); printf("%d\n", res); } } return 0; }