#include <stdio.h>
#include <string.h>
const int MAXN = 1e6+10;
int num[MAXN];
int cnt[MAXN];
int C,N,M;
bool isPrime(int num)
{
if(num <= 1) return false;
for(int i = 2; i*i <= num; ++i)
if(num%i == 0)
return false;
return true;
}
int lowBit(int x)
{
return x&-x;
}
int sum(int i)
{
int s = 0;
while(i > 0)
{
s += cnt[i];
i -= lowBit(i);
}
return s;
}
void add(int i, int x)
{
while(i <= C)
{
cnt[i] += x;
i += lowBit(i);
}
}
int main()
{
int cmd,a,b,flag;
int time = 0;
while(scanf("%d %d %d",&C,&N,&M) &&(C+N+M))
{
memset(cnt,0,sizeof(cnt));
printf("CASE #%d:\n",++time);
if(isPrime(M)) flag = 1;
else flag = 0;
for(int i = 1; i <= C; ++i)
{
num[i] = M;
add(i,flag);
}
while(N--)
{
scanf("%d %d %d",&cmd,&a,&b);
if(cmd == 0)
{
if(isPrime(num[a]))
{
num[a] += b;
if(!isPrime(num[a]))
add(a,-1);
}
else
{
num[a] += b;
if(isPrime(num[a]))
add(a,1);
}
}
else
{
printf("%d\n",sum(b)-sum(a-1));
}
}
printf("\n");
}
return 0;
}
hoj 1867 经理的烦恼 (树状数组)
最新推荐文章于 2017-10-17 17:34:09 发布