#include<iostream>
#include<bits/stdc++.h>
using namespace std;
#define maxn 100007
#define ll long long
#define br '\n'
#define pb push_back
#define mod1 1000000007
#define mod 998244353
#define INF 0x3f3f3f3f
#define limit 1e18
set<ll>um;
void seive()
{
ll n=1e6 + 1;
bool prime[n+1];
memset(prime,true,sizeof(prime));
for(ll p=2;p*p<=n;p++)
{
if(prime[p]==true)
{
for(ll i=p*p;i<=n;i+=p)
{
prime[i]=false;
}
}
}
for (int p = 2; p <= n; p++)
{
if (prime[p])
{
um.insert(p);
}
}
}
typedef struct Node
{
ll data=0;
}Node;
Node seg[4*100001];
Node lazy[4*100001];
vector<ll>arr;
void setup()
{
for(ll i=0;i<4*100001;i++)
{
seg[i].data=0;
lazy[i].data=0;
}
}
Node merge(Node leftChild, Node rightChild)
{
Node parentNode;
parentNode.data=leftChild.data+rightChild.data;
return parentNode;
}
void build(ll index,ll low,ll high)
{
if(low==high)
{
seg[index].data=arr[low];
return;
}
ll mid=(low+high)/2;
build(2*index+1,low,mid);
build(2*index+2,mid+1,high);
seg[index]=merge(seg[2*index+1],seg[2*index+2]);
}
void update(ll index,ll low,ll high,ll l,ll r,ll val)
{
if(lazy[index].data!=0)
{
seg[index].data +=(high-low+1)*(lazy[index].data);
if(low!=high)
{
lazy[2*index+1].data +=lazy[index].data;
lazy[2*index+2].data +=lazy[index].data;
}
lazy[index].data=0;
}
if(r<low || l>high || low>high)
{
return;
}
if(low>=l && high<=r)
{
seg[index].data =(high-low+1)*val;
if(low!=high)
{
lazy[2*index+1].data+=val;
lazy[2*index+2].data+=val;
}
return ;
}
ll mid=(high+low)/2;
update(2*index+1,low,mid,l,r,val);
update(2*index+2,mid+1,high,l,r,val);
seg[index]=merge(seg[2*index+1],seg[2*index+2]);
}
ll query(ll index,ll low,ll high,ll l,ll r)
{
if(lazy[index].data!=0)
{
seg[index].data +=(high-low+1)* (lazy[index].data);
if(low!=high)
{
lazy[2*index+1].data +=lazy[index].data;
lazy[2*index+2].data +=lazy[index].data;
}
lazy[index].data=0;
}
if(r<low || l>high || low>high)
{
return 0;
}
if(low>=l && high<=r)
{
return seg[index].data;
}
ll mid=(low+high)/2;
return query(2*index+1,low,mid,l,r)+query(2*index+2,mid+1,high,l,r);
}
void solve()
{
ll n,q,type,x,y,val;
scanf("%lld %lld",&n,&q);
setup();
arr.resize(n);
for(ll i=0;i<n;i++)
{
scanf("%lld",&arr[i]);
ll v=0;
if(um.find(arr[i])!=um.end())
{
v=1;
}
arr[i]=v;
}
build(0,0,n-1);
ll l;
for(ll i=0;i<q;i++)
{
cin>>type;
if(type==1)
{
cin>>x>>y;
x--;
y--;
ll ans=query(0,0,n-1,x,y);
printf("%lld\n", ans);
}
else
{
cin>>x>>y>>val;
x--;
y--;
ll v=0;
if(um.find(val)!=um.end())
{
v=1;
}
update(0,0,n-1,x,y,v);
}
}
}
int main()
{
int t=1;
seive();
cin>>t;
for(ll t1=1;t1<=t;t1++)
{
printf("Case %lld:\n", t1);
solve();
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbWF4biAxMDAwMDcKI2RlZmluZSBsbCBsb25nIGxvbmcgCiNkZWZpbmUgYnIgJ1xuJwojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1vZDEgMTAwMDAwMDAwNwojZGVmaW5lIG1vZCA5OTgyNDQzNTMKI2RlZmluZSBJTkYgIDB4M2YzZjNmM2YKI2RlZmluZSBsaW1pdCAxZTE4CiAKCgoKc2V0PGxsPnVtOwoKdm9pZCBzZWl2ZSgpCnsKCWxsIG49MWU2ICsgMTsKCglib29sIHByaW1lW24rMV07CgltZW1zZXQocHJpbWUsdHJ1ZSxzaXplb2YocHJpbWUpKTsKCglmb3IobGwgcD0yO3AqcDw9bjtwKyspCgl7CgkJaWYocHJpbWVbcF09PXRydWUpCgkJewoJCQlmb3IobGwgaT1wKnA7aTw9bjtpKz1wKQoJCQl7CgkJCQlwcmltZVtpXT1mYWxzZTsKCQkJfQoJCX0KCX0KCWZvciAoaW50IHAgPSAyOyBwIDw9IG47IHArKykKCXsKICAgICAgICBpZiAocHJpbWVbcF0pCiAgICAgICAgewogICAgICAgIAl1bS5pbnNlcnQocCk7CiAgICAgICAgfQogICAgfQp9CgoKCgoKdHlwZWRlZiBzdHJ1Y3QgTm9kZQp7CiAgICAKICAgIAogICAgbGwgZGF0YT0wOwogICAgCn1Ob2RlOwoKCgoKTm9kZSBzZWdbNCoxMDAwMDFdOwpOb2RlIGxhenlbNCoxMDAwMDFdOwp2ZWN0b3I8bGw+YXJyOwoKdm9pZCBzZXR1cCgpCnsKCWZvcihsbCBpPTA7aTw0KjEwMDAwMTtpKyspCgl7CgkJc2VnW2ldLmRhdGE9MDsKCQlsYXp5W2ldLmRhdGE9MDsKCX0KfQoKCk5vZGUgbWVyZ2UoTm9kZSBsZWZ0Q2hpbGQsIE5vZGUgcmlnaHRDaGlsZCkKewogICAgTm9kZSBwYXJlbnROb2RlOwogICAgCiAgICBwYXJlbnROb2RlLmRhdGE9bGVmdENoaWxkLmRhdGErcmlnaHRDaGlsZC5kYXRhOwoKICAgIHJldHVybiBwYXJlbnROb2RlOwoKCn0KCgoKdm9pZCBidWlsZChsbCBpbmRleCxsbCBsb3csbGwgaGlnaCkKewogICAgaWYobG93PT1oaWdoKQogICAgewogICAgCQogICAgICAgIHNlZ1tpbmRleF0uZGF0YT1hcnJbbG93XTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBsbCBtaWQ9KGxvdytoaWdoKS8yOwogICAgYnVpbGQoMippbmRleCsxLGxvdyxtaWQpOwogICAgYnVpbGQoMippbmRleCsyLG1pZCsxLGhpZ2gpOwogICAgc2VnW2luZGV4XT1tZXJnZShzZWdbMippbmRleCsxXSxzZWdbMippbmRleCsyXSk7Cn0KCgoKCnZvaWQgdXBkYXRlKGxsIGluZGV4LGxsIGxvdyxsbCBoaWdoLGxsIGwsbGwgcixsbCB2YWwpCnsKICAgIGlmKGxhenlbaW5kZXhdLmRhdGEhPTApCiAgICB7CiAgICAgICAgc2VnW2luZGV4XS5kYXRhICs9KGhpZ2gtbG93KzEpKihsYXp5W2luZGV4XS5kYXRhKTsKICAgICAgICBpZihsb3chPWhpZ2gpCiAgICAgICAgewogICAgICAgICAgICBsYXp5WzIqaW5kZXgrMV0uZGF0YSArPWxhenlbaW5kZXhdLmRhdGE7CgkJCWxhenlbMippbmRleCsyXS5kYXRhICs9bGF6eVtpbmRleF0uZGF0YTsKICAgICAgICB9CiAgICAgICAgbGF6eVtpbmRleF0uZGF0YT0wOwogICAgfQoKICAgIGlmKHI8bG93IHx8IGw+aGlnaCB8fCBsb3c+aGlnaCkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYobG93Pj1sICYmIGhpZ2g8PXIpCiAgICB7CiAgICAJCiAgICAgICAgc2VnW2luZGV4XS5kYXRhID0oaGlnaC1sb3crMSkqdmFsOwogICAgICAgIAogICAgICAgIGlmKGxvdyE9aGlnaCkKICAgICAgICB7CiAgICAgICAgICAgCgogICAgICAgICAgICBsYXp5WzIqaW5kZXgrMV0uZGF0YSs9dmFsOwogICAgICAgICAgICBsYXp5WzIqaW5kZXgrMl0uZGF0YSs9dmFsOwoKCiAgICAgICAgfQogICAgICAgIHJldHVybiA7CiAgICB9CgogICAgbGwgbWlkPShoaWdoK2xvdykvMjsKICAgIHVwZGF0ZSgyKmluZGV4KzEsbG93LG1pZCxsLHIsdmFsKTsKICAgIHVwZGF0ZSgyKmluZGV4KzIsbWlkKzEsaGlnaCxsLHIsdmFsKTsKICAgIHNlZ1tpbmRleF09bWVyZ2Uoc2VnWzIqaW5kZXgrMV0sc2VnWzIqaW5kZXgrMl0pOwp9CgoKbGwgIHF1ZXJ5KGxsIGluZGV4LGxsIGxvdyxsbCBoaWdoLGxsIGwsbGwgcikKewoJaWYobGF6eVtpbmRleF0uZGF0YSE9MCkKCXsKCQlzZWdbaW5kZXhdLmRhdGEgKz0oaGlnaC1sb3crMSkqIChsYXp5W2luZGV4XS5kYXRhKTsKCQlpZihsb3chPWhpZ2gpCgkJewoJCQlsYXp5WzIqaW5kZXgrMV0uZGF0YSArPWxhenlbaW5kZXhdLmRhdGE7CgkJCWxhenlbMippbmRleCsyXS5kYXRhICs9bGF6eVtpbmRleF0uZGF0YTsKCQl9CgkJbGF6eVtpbmRleF0uZGF0YT0wOwoJfQoKCgoJaWYocjxsb3cgfHwgbD5oaWdoIHx8IGxvdz5oaWdoKQoJewoJCXJldHVybiAwOwoJfQoKCWlmKGxvdz49bCAmJiBoaWdoPD1yKQoJewoJCXJldHVybiBzZWdbaW5kZXhdLmRhdGE7Cgl9CgoJbGwgbWlkPShsb3craGlnaCkvMjsKCXJldHVybiBxdWVyeSgyKmluZGV4KzEsbG93LG1pZCxsLHIpK3F1ZXJ5KDIqaW5kZXgrMixtaWQrMSxoaWdoLGwscik7Cgp9Cgp2b2lkIHNvbHZlKCkKewogICAgbGwgbixxLHR5cGUseCx5LHZhbDsKICAgIAogICAgIHNjYW5mKCIlbGxkICVsbGQiLCZuLCZxKTsKICAgCiAJc2V0dXAoKTsKICAgIGFyci5yZXNpemUobik7CiAgICBmb3IobGwgaT0wO2k8bjtpKyspCiAgICB7CiAgICAgICAgCiAgICAgICAgc2NhbmYoIiVsbGQiLCZhcnJbaV0pOwogICAgICAgIGxsIHY9MDsKICAgICAgICBpZih1bS5maW5kKGFycltpXSkhPXVtLmVuZCgpKQogICAgICAgCXsKICAgICAgIAkJdj0xOwogICAgICAgCX0KICAgICAgIAlhcnJbaV09djsKICAgCiAgICAgICAgCiAgICB9CiAgICBidWlsZCgwLDAsbi0xKTsKICAgIGxsIGw7CgogICAgCiAgICBmb3IobGwgaT0wO2k8cTtpKyspCiAgICB7CiAgICAgICAgY2luPj50eXBlOwogICAgICAgIGlmKHR5cGU9PTEpCiAgICAgICAgewogICAgICAgICAgICAKICAgICAgICAgICAgY2luPj54Pj55OwogICAgICAgICAgIAogICAgICAgICAgICB4LS07CiAgICAgICAgICAgIHktLTsKICAgICAgICAgICAgbGwgYW5zPXF1ZXJ5KDAsMCxuLTEseCx5KTsKICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgIAogICAgICAgICAgICBwcmludGYoIiVsbGRcbiIsIGFucyk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGNpbj4+eD4+eT4+dmFsOwogICAgICAgICAgIAl4LS07CiAgICAgICAgICAgCXktLTsKICAgICAgICAgICAJbGwgdj0wOwogICAgICAgICAgIAlpZih1bS5maW5kKHZhbCkhPXVtLmVuZCgpKQogICAgICAgICAgIAl7CiAgICAgICAgICAgCQl2PTE7CiAgICAgICAgICAgCX0KICAgICAgICAgICAgdXBkYXRlKDAsMCxuLTEseCx5LHYpOwogICAgICAgIH0KICAgIH0KCn0KCmludCBtYWluKCkKewogICAgCiAgICBpbnQgdD0xOwogICAgc2VpdmUoKTsKICAgIGNpbj4+dDsKICAgIGZvcihsbCB0MT0xO3QxPD10O3QxKyspCiAgICB7CiAgICAJCiAgICAJcHJpbnRmKCJDYXNlICVsbGQ6XG4iLCB0MSk7CiAgICAgICAgc29sdmUoKTsKICAgIH0KfQoK