hoj1867
/*This Code is Submitted by billforum for Problem 1867 at 2012-02-09 14:48:18*/ #include <iostream> #include <cstring> #include <queue> #include <set> #include <deque> using namespace std; const int N=1000001; const int M=1000001; int in[N+1]; int pn,p[M],a[N]; bool f[10000001]; int lowbit(int x) { return (x&(x^(x-1))); } int sumn(int x) { int s=0; while(x>0) { s+=in[x]; x-=lowbit(x); } return s; } void plusn(int pos,int num) { while(pos<N) { in[pos]+=num; pos+=lowbit(pos); } } void init() { memset(f,1,sizeof(f)); f[0]=0; f[1]=0; pn=0; for(int i=2;i<10000001;i++) { if(f[i]) p[pn++]=i; for(int j=0;(j<pn)&&(i*p[j]<10000001);j++) { f[i*p[j]]=0; if(i%p[j]==0) break; } } } int main(){ int c,n,m,id=0; int b,x,y; init(); while(cin>>c>>n>>m) { if((n==0)&&(m==0)&&(c==0)) break; id++; cout<<"CASE #"<<id<<":"<<endl; in[0]=0; for(int i=1;i<=c;i++) { in[i]=0; a[i]=m; } for(int i=1;i<=c;i++) in[i]=f[m]*(lowbit(i)); for(int j=1;j<=n;j++) { cin>>b>>x>>y; if(b==0) { int tmp=a[x]+y;//0? if(f[a[x]]==f[tmp]) a[x]=tmp; else { plusn(x,f[tmp]-f[a[x]]); a[x]=tmp; } }// else if(b==1) { int t1,t2; t1=sumn(x-1); t2=sumn(y); cout<<t2-t1<<endl; }//else } cout<<endl; } return 0; }
筛素+树状数组