Guest User

rangetree1

a guest
Aug 11th, 2014
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. struct nodo{
  6.     int s;
  7.     int e;
  8.     int value;
  9.     int aggiornato;
  10.     int inverti;
  11. };
  12.  
  13. void create(struct nodo tree[], int index, int s, int e);
  14. void stampa(struct nodo tree[], int n);
  15. int query(struct nodo tree[], int index, int a, int b);
  16. void change(struct nodo tree[], int index, int a, int b);
  17.  
  18. main(){
  19.     FILE *pF = fopen("input.txt", "r");
  20.     int n,righe;
  21.     fscanf(pF, "%d %d", &n, &righe);
  22.    
  23.     int i = 0;
  24.     /*
  25.     while(n > pow(2,i))
  26.         i++;
  27.        
  28.     while(n != pow(2,i))
  29.         n++;
  30.     */ 
  31.     struct nodo tree[4*n];
  32.     create(tree, 1, 0, n-1);
  33.    
  34.     FILE *pF2 = fopen("output.txt", "w");
  35.     int op, a, b;
  36.     for(i=0; i<righe; i++){
  37.         fscanf(pF, "\n%d %d %d", &op, &a, &b);
  38.  
  39.         system("cls");
  40.         stampa(tree, 2*n);
  41.        
  42.         printf("\n\nop: %d\ta:%d\tb:%d\n\n", op, a, b);
  43.  
  44.         if(op==1)
  45.             fprintf(pF2, "%d\n", query(tree, 1, a, b));
  46.         else
  47.             change(tree, 1, a, b);
  48.  
  49.         stampa(tree, 2*n);
  50.         system("pause");
  51.     }
  52.     fclose(pF2);   
  53.     fclose(pF);
  54. }
  55.  
  56. void create(struct nodo tree[], int index, int s, int e){
  57.    
  58.     tree[index].value = 0;
  59.     tree[index].inverti = 0;
  60.     tree[index].aggiornato = 1;
  61.     tree[index].s = s;
  62.     tree[index].e = e;
  63.    
  64.     if(s != e){
  65.         create(tree, index*2, s, (s+e)/2);
  66.         create(tree, index*2+1, (s+e)/2+1, e);
  67.     }
  68. }
  69.  
  70. void change(struct nodo tree[], int index, int a, int b){
  71.  
  72.     if(tree[index].s > b || tree[index].e < a)
  73.         return;        
  74.  
  75.     if(tree[index].s >= a && tree[index].e <= b){
  76.         tree[index].inverti = (tree[index].inverti+1)%2;
  77.         tree[index].aggiornato = 0;
  78.         return; //non hai altro da fare in questo nodo
  79.     }
  80.    
  81.     tree[index].aggiornato = 0;
  82.    
  83.     change(tree, index*2, a, b);
  84.     change(tree, index*2+1, a, b);
  85.  
  86. }
  87.  
  88.  
  89. int query(struct nodo tree[], int index, int a, int b){
  90. printf("\n%d, %d, %d",index,a,b)    ;
  91.     if(tree[index].s > b || tree[index].e < a)
  92.         return 0;
  93.  
  94.     if(tree[index].s >= a && tree[index].e <= b){
  95.        
  96.         if(tree[index].aggiornato)
  97.             return tree[index].value;
  98.         else{          
  99.             if(tree[index].inverti){
  100.                 if(tree[index].s != tree[index].e){
  101.                     tree[index].inverti = 0;
  102.                     tree[index*2].inverti = (tree[index*2].inverti+1)%2;
  103.                     tree[index*2+1].inverti = (tree[index*2+1].inverti+1)%2;
  104.                     tree[index*2].aggiornato = 0;
  105.                     tree[index*2+1].aggiornato = 0;
  106.                    
  107.                     tree[index].value = query(tree, index*2, a, b) + query(tree, index*2+1, a, b);
  108.                     tree[index].aggiornato = 1;
  109.                     return tree[index].value;
  110.                 }
  111.                 else{
  112.                     tree[index].inverti = 0;
  113.                     tree[index].value = (tree[index].value+1)%2;
  114.                     tree[index].aggiornato = 1;
  115.                     return tree[index].value;
  116.                 }
  117.             }
  118.             else
  119.                 if(tree[index].s == tree[index].e){
  120.                     tree[index].aggiornato = 1;
  121.                     return tree[index].value;
  122.                 }
  123.            
  124.         }
  125.     }
  126.    
  127.     if(tree[index].inverti){
  128.         tree[index].inverti = 0;
  129.         tree[index*2].inverti = (tree[index*2].inverti+1)%2;
  130.         tree[index*2+1].inverti = (tree[index*2+1].inverti+1)%2;
  131.         tree[index*2].aggiornato = 0;
  132.         tree[index*2+1].aggiornato = 0;
  133.     }
  134.    
  135.     tree[index].value = query(tree, index*2, a, b) + query(tree, index*2+1, a, b);
  136.     tree[index].aggiornato = 1;
  137.     return tree[index].value;
  138. }
  139.  
  140.  
  141. void stampa(struct nodo tree[], int n){
  142.     printf("\n\n");
  143.     int i;
  144.     int c = 1;
  145.     for(i=1; i<n; i++){
  146.         if(c == i){
  147.             printf("\n");
  148.             c *= 2;
  149.         }
  150.         printf("\nNodo %d, start = %d, end = %d, aggiornato = %d, inverti = %d, value = %d", i, tree[i].s, tree[i].e, tree[i].aggiornato, tree[i].inverti, tree[i].value);
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment