树状数组技术题目,加了一个判素;
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 1000010;
int c[MAXN];//树状数组中那个c数组;
int arr[MAXN];//arr[i]用来存放商店i中商品的个数
int C, N, M;
int lowbit( int x )
{
return x & (-x);
}
void UFset(int pos, int data)
{
while(pos <= MAXN)
{
c[pos] += data;
pos += lowbit( pos );
}
}
int Querry( int pos )
{
int sum = 0;
while( pos > 0 )
{
sum += c[pos];
pos -= lowbit( pos );
}
return sum;
}
bool Prime( int x )//判素
{
if(x <= 1)
return false;
else
{
for(int i = 2; i*i <= x; ++i)
if(x%i == 0)
return false;
return true;
}
}
int main()
{
int a, b, k;
int kcase = 1;
while(cin>>C>>N>>M)
{
if(C == 0 && N == 0 && M == 0)
break;
bool t = Prime( M );//判素,看刚开始时每家商店商品数量的奇偶性
memset(c, 0, sizeof(c));
arr[0] = 0;
for(int i = 1; i <= C; ++i)
{
if(t)
UFset(i, 1);//如果M是素数的话,那么就要统计初始时商品为奇数的商店的个数
arr[i] = M;
}
cout<<"CASE #"<<kcase++<<":"<<endl;
for(int i = 1; i <= N; ++i)
{
cin>>k>>a>>b;
if(k == 0)
{
if( Prime(arr[a]) )//加上这一句就是因为:如果arr[a]一开始就是素数,加上或减去b后仍是素数,后面那个if语句就会多增加1,只是结果错误
UFset(a, -1);
arr[a] += b;
if( Prime(arr[a]) )
UFset(a, 1);
}
else
cout<<Querry(b) - Querry(a-1)<<endl;
}
cout<<endl;
}
return 0;
}