您的位置:首页 > 其它

hoj 1867 经理的烦恼 (树状数组)

2017-08-11 14:58 429 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: