首页 > 代码库 > hoj 经理的烦恼
hoj 经理的烦恼
简单树状数组;
模板,,
题目大意,给定N个商店,有初始商品数量.有两种指令,0 x y 表示x位置的商店的商品数量增加y
1 x y 表示查询[x,y]区间内的商品数量为素数的商店的数目..
这里更新的条件就变成去判断更新值是否从非素数变成素数或是从素数变成非素数..
然后对树状数组进行更新..
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int tree[1000010];
bool vis[1000010];
int num[1000010],a;
int qq(int c)
{
if(c<=1) return 0;
for(int i=2;i*i<=c;i++)
{
if(c%i==0)
return 0;
}
return 1;
}
int Lowbit(int i)
{
return i&(-i);
}
int show(int x)
{
int sum=0;
while(x>0)
{
sum+=tree[x];
x-=Lowbit(x);
}
return sum;
}
void yy(int x)
{
if(qq(num[x]))
{
if(!vis[x])
{
vis[x]=1;
while(x<=a)
{
tree[x]++;
x+=Lowbit(x);
}
}
}
else
{
if(vis[x])
{
vis[x]=0;
while(x<=a)
{
tree[x]--;
x+=Lowbit(x);
}
}
}
}
int main()
{
int b,c;
int t=0;
int q,w,e;
while(scanf("%d %d %d",&a,&b,&c))
{
t++;
if(a==0&&b==0&&c==0)
break;
printf("CASE #%d:\n",t);
for(int i=1;i<=a;i++)
num[i]=c;
if(qq(c))
{
for(int i=1;i<=a;i++)
{
vis[i]=1;
tree[i]=Lowbit(i);
}
}
else
{
memset(tree,0,sizeof(tree));
memset(vis,0,sizeof(vis));
}
for(int i=1;i<=b;i++)
{
scanf("%d%d%d",&q,&w,&e);
if(q==1)
{
printf("%d\n",show(e)-show(w-1));
}
else
{
num[w]+=e;
yy(w);
}
}
printf("\n");
}
return 0;
}