tcbpg

Codeforces 109 D - Colliders

Mar 9th, 2012
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. #define forn(i,n) for(int i=0;i<(int)(n);i++)
  6. #define forsn(i,s,n) for(int i=(int)(s);i<(int)(n);i++)
  7. #define forall(i,c) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
  8. const int MAXN=100100;
  9.  
  10. int stat[MAXN],primes[MAXN], pc;
  11. bool criba[MAXN];
  12. int assig[MAXN];
  13.  
  14. void getprimes(int n){
  15.     forn(i,n+1) criba[i]=true;
  16.     for(int i = 2; i <= n; i++){
  17.         if(criba[i]){
  18.             for(int j = 2*i; j <= n; j+=i){
  19.                 criba[j]=false;
  20.             }
  21.         }
  22.     }
  23.    
  24.     pc=0;
  25.     for(int i=2;i<=n; i++){
  26.         if(criba[i]){
  27.             assig[i]=-1;
  28.             primes[pc++]=i;
  29.         }
  30.     }
  31. }
  32.  
  33. void remove(int n){
  34.     forn(i,pc){
  35.         if(primes[i]*primes[i] > n) break;
  36.  
  37.         bool div=false;
  38.         while(n % primes[i] == 0){
  39.             div=true;
  40.             n /= primes[i];
  41.         }
  42.         if(div){
  43.             assig[primes[i]]=-1;
  44.         }
  45.     }
  46.     if(n > 1){
  47.         assig[n]=-1;
  48.     }
  49. }
  50.  
  51. void add(int n){
  52.     int k = n;
  53.     forn(i,pc){
  54.         if(primes[i]*primes[i] > n) break;
  55.  
  56.         bool div=false;
  57.         while(n % primes[i] == 0){
  58.             div=true;
  59.             n /= primes[i];
  60.         }
  61.         if(div){
  62.             assig[primes[i]]=k;
  63.         }
  64.     }
  65.     if(n > 1){
  66.         assig[n]=k;
  67.     }
  68. }
  69.  
  70. int check(int n){
  71.     forn(i,pc){
  72.         if(primes[i]*primes[i] > n) break;
  73.        
  74.         bool div=false;
  75.         while(n % primes[i] == 0){
  76.             div=true;
  77.             n /= primes[i];
  78.         }
  79.         if(div){
  80.             if(assig[primes[i]] > 0)
  81.                 return assig[primes[i]];
  82.         }
  83.     }
  84.     if(n > 1){
  85.         return assig[n];
  86.     }
  87.     return -1;
  88. }
  89.  
  90. void solve(){
  91.     int n,m; scanf("%d %d\n",&n,&m);
  92.     getprimes(n+1);
  93.  
  94.     forn(i,n+1) stat[i] = 0;
  95.  
  96.     char c; int k;
  97.     forn(i,m){
  98.         scanf("%c %d\n",&c,&k); int j;
  99.  
  100.         if(c == '+'){
  101.             if(stat[k]){
  102.                 printf("Already on\n");
  103.             }else if((j = check(k)) != -1){
  104.                 printf("Conflict with %d\n",j);
  105.             }else{
  106.                 printf("Success\n");
  107.                 add(k);
  108.                 stat[k]=1;
  109.             }
  110.         }else{
  111.             if(!stat[k]){
  112.                 printf("Already off\n");
  113.             }else{
  114.                 printf("Success\n");
  115.                 stat[k]=0;
  116.                 remove(k);
  117.             }
  118.         }
  119.     }
  120. }
  121.  
  122. int main(){
  123.     #ifdef JUAMPI
  124.         freopen("Colliders.in","r",stdin);
  125.         int tests; cin >> tests;
  126.         while(tests--) solve();
  127.     #else
  128.         solve();
  129.     #endif
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment