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

来源:互联网 发布:阿里云欠费 编辑:程序博客网 时间:2024/05/21 10:05
#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;}
原创粉丝点击