//代码含全角空格
#include <iostream>
#include <cstdio>
#include <cstring>
//树状数组里存的是为素数的店数
//普通数组存原数据
//在店里商品从素数变为非素或非素变为素是树状数组更新
using namespace std;
const int MAXN=1000005;
int a[MAXN],c[MAXN];
bool p[10000001];
int C,T;
void prime(){
p[0]=true;
p[1]=true;
for(int i=2;i<=10000001;i++){
if(!p[i])
for(int j=i+i;j<=10000001;j+=i)
p[j]=true;
}
}
int lowbit(int i){
return i&(-i);
}
void update(int x,int y){
for(int i=x;i<=C;i+=lowbit(i))
c[i]+=y;
}
int getsum(int x){
int sum=0;
for(int i=x;i>0;i-=lowbit(i))
sum+=c[i];
return sum;
}
int main()
{
int N,M,op,x,y;
prime();
while(scanf("%d%d%d",&C,&N,&M)&&(C+N+M)){
printf("CASE #%d:\n",++T);
memset(c,0,sizeof(c));
int tmp=p[M]?0:1;
for(int i=1;i<=C;i++){
a[i]=M;
update(i,tmp);
}
while(N--){
scanf("%d%d%d",&op,&x,&y);
if(op)
printf("%d\n",getsum(y)-getsum(x-1));
else {
a[x]+=y;
if(p[a[x]-y]&&!p[a[x]])update(x,1);
if(!p[a[x]-y]&&p[a[x]])update(x,-1);
}
}
printf("\n");
}
return 0;
}