#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6 + 9, MAXX = 1e4 + 9;
int n, q, arr[MAXX], tree[MAXX << 2], Lazy[MAXX << 2];
bool Prime[MAX];
void Sieve(){
Prime[0] = Prime[1] = true;
for(int i=2; i<MAX; i++){
if(Prime[i]) continue;
for(long long j=1ll*i*i; j<MAX; j+=i)
Prime[j] = true;
}
}
void Build(int id = 1, int L = 1, int R = n) {
if(L == R) {
tree[id] = !Prime[ arr[L] ];
return;
}
int mid = (L + R) >> 1;
Build(id << 1, L, mid);
Build(id << 1 | 1, mid + 1, R);
tree[id] = tree[id << 1] + tree[id << 1 | 1];
}
void Propagate(int id, int L, int mid, int R) {
if(!Lazy[id]) return;
//if(L == R) return;
Lazy[id << 1] = Lazy[id];
Lazy[id << 1 | 1] = Lazy[id];
tree[id << 1] = !Prime[ Lazy[id] ] * (mid - L + 1);
tree[id << 1 | 1] = !Prime[ Lazy[id] ] * (R - mid);
Lazy[id] = 0;
}
void Update(int st, int en, int val, int id = 1, int L = 1, int R = n) {
if(st > R || L > en) return;
if(st <= L && R <= en) {
tree[id] = !Prime[val] * (R - L + 1);
Lazy[id] = val;
return;
}
int mid = (L + R) >> 1;
Propagate(id, L, mid, R);
Update(st, en, val, id << 1, L, mid);
Update(st, en, val, id << 1 | 1, mid + 1, R);
tree[id] = tree[id << 1] + tree[id << 1 | 1];
}
int Query(int st, int en, int id = 1, int L = 1, int R = n) {
if(st <= L && R <= en)
return tree[id];
int mid = (L + R) >> 1;
Propagate(id, L, mid, R);
if(mid >= en)
return Query(st, en, id << 1, L, mid);
if(mid < st)
return Query(st, en, id << 1 | 1, mid + 1, R);
return Query(st, en, id << 1, L, mid) + Query(st, en, id << 1 | 1, mid + 1, R);
}
int main() {
int T; scanf("%d", &T);
Sieve();
for(int A = 1; A <= T; A++) {
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; i++)
scanf("%d", arr + i);
Build();
printf("Case %d:\n", A);
while(q--) {
int t, L, R, val;
scanf("%d %d %d", &t, &L, &R);
if(t == 1)
printf("%d\n", Query(L, R));
else {
scanf("%d", &val);
Update(L, R, val);
}
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTUFYID0gMWU2ICsgOSwgTUFYWCA9IDFlNCArIDk7CgppbnQgbiwgcSwgYXJyW01BWFhdLCB0cmVlW01BWFggPDwgMl0sIExhenlbTUFYWCA8PCAyXTsKYm9vbCBQcmltZVtNQVhdOwoKdm9pZCBTaWV2ZSgpewogICAgUHJpbWVbMF0gPSBQcmltZVsxXSA9IHRydWU7CiAgICBmb3IoaW50IGk9MjsgaTxNQVg7IGkrKyl7CiAgICAgICAgaWYoUHJpbWVbaV0pIGNvbnRpbnVlOwogICAgICAgIGZvcihsb25nIGxvbmcgaj0xbGwqaSppOyBqPE1BWDsgais9aSkKICAgICAgICAgICAgUHJpbWVbal0gPSB0cnVlOwogICAgfQp9Cgp2b2lkIEJ1aWxkKGludCBpZCA9IDEsIGludCBMID0gMSwgaW50IFIgPSBuKSB7CiAgICBpZihMID09IFIpIHsKICAgICAgICB0cmVlW2lkXSA9ICFQcmltZVsgYXJyW0xdIF07CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZCA9IChMICsgUikgPj4gMTsKICAgIEJ1aWxkKGlkIDw8IDEsIEwsIG1pZCk7CiAgICBCdWlsZChpZCA8PCAxIHwgMSwgbWlkICsgMSwgUik7CiAgICB0cmVlW2lkXSA9IHRyZWVbaWQgPDwgMV0gKyB0cmVlW2lkIDw8IDEgfCAxXTsKfQoKdm9pZCBQcm9wYWdhdGUoaW50IGlkLCBpbnQgTCwgaW50IG1pZCwgaW50IFIpIHsKICAgIGlmKCFMYXp5W2lkXSkgcmV0dXJuOwogICAgLy9pZihMID09IFIpIHJldHVybjsKICAgIExhenlbaWQgPDwgMV0gPSBMYXp5W2lkXTsKICAgIExhenlbaWQgPDwgMSB8IDFdID0gTGF6eVtpZF07CiAgICB0cmVlW2lkIDw8IDFdID0gIVByaW1lWyBMYXp5W2lkXSBdICogKG1pZCAtIEwgKyAxKTsKICAgIHRyZWVbaWQgPDwgMSB8IDFdID0gIVByaW1lWyBMYXp5W2lkXSBdICogKFIgLSBtaWQpOwogICAgTGF6eVtpZF0gPSAwOwp9Cgp2b2lkIFVwZGF0ZShpbnQgc3QsIGludCBlbiwgaW50IHZhbCwgaW50IGlkID0gMSwgaW50IEwgPSAxLCBpbnQgUiA9IG4pIHsKICAgIGlmKHN0ID4gUiB8fCBMID4gZW4pIHJldHVybjsKICAgIGlmKHN0IDw9IEwgJiYgUiA8PSBlbikgewogICAgICAgIHRyZWVbaWRdID0gIVByaW1lW3ZhbF0gKiAoUiAtIEwgKyAxKTsKICAgICAgICBMYXp5W2lkXSA9IHZhbDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpbnQgbWlkID0gKEwgKyBSKSA+PiAxOwogICAgUHJvcGFnYXRlKGlkLCBMLCBtaWQsIFIpOwogICAgVXBkYXRlKHN0LCBlbiwgdmFsLCBpZCA8PCAxLCBMLCBtaWQpOwogICAgVXBkYXRlKHN0LCBlbiwgdmFsLCBpZCA8PCAxIHwgMSwgbWlkICsgMSwgUik7CiAgICB0cmVlW2lkXSA9IHRyZWVbaWQgPDwgMV0gKyB0cmVlW2lkIDw8IDEgfCAxXTsKfQoKaW50IFF1ZXJ5KGludCBzdCwgaW50IGVuLCBpbnQgaWQgPSAxLCBpbnQgTCA9IDEsIGludCBSID0gbikgewogICAgaWYoc3QgPD0gTCAmJiBSIDw9IGVuKQogICAgICAgIHJldHVybiB0cmVlW2lkXTsKICAgIGludCBtaWQgPSAoTCArIFIpID4+IDE7CiAgICBQcm9wYWdhdGUoaWQsIEwsIG1pZCwgUik7CiAgICBpZihtaWQgPj0gZW4pCiAgICAgICAgcmV0dXJuIFF1ZXJ5KHN0LCBlbiwgaWQgPDwgMSwgTCwgbWlkKTsKICAgIGlmKG1pZCA8IHN0KQogICAgICAgIHJldHVybiBRdWVyeShzdCwgZW4sIGlkIDw8IDEgfCAxLCBtaWQgKyAxLCBSKTsKICAgIHJldHVybiBRdWVyeShzdCwgZW4sIGlkIDw8IDEsIEwsIG1pZCkgKyBRdWVyeShzdCwgZW4sIGlkIDw8IDEgfCAxLCBtaWQgKyAxLCBSKTsKfQoKaW50IG1haW4oKSB7CiAgICBpbnQgVDsgc2NhbmYoIiVkIiwgJlQpOwogICAgU2lldmUoKTsKICAgIGZvcihpbnQgQSA9IDE7IEEgPD0gVDsgQSsrKSB7CgogICAgICAgIHNjYW5mKCIlZCAlZCIsICZuLCAmcSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgICAgICBzY2FuZigiJWQiLCBhcnIgKyBpKTsKCiAgICAgICAgQnVpbGQoKTsKICAgICAgICBwcmludGYoIkNhc2UgJWQ6XG4iLCBBKTsKICAgICAgICB3aGlsZShxLS0pIHsKICAgICAgICAgICAgaW50IHQsIEwsIFIsIHZhbDsKICAgICAgICAgICAgc2NhbmYoIiVkICVkICVkIiwgJnQsICZMLCAmUik7CiAgICAgICAgICAgIGlmKHQgPT0gMSkKICAgICAgICAgICAgICAgIHByaW50ZigiJWRcbiIsIFF1ZXJ5KEwsIFIpKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCAmdmFsKTsKICAgICAgICAgICAgICAgIFVwZGF0ZShMLCBSLCB2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9