damihenrique

guloso _ contestbruno

Aug 20th, 2014
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 KB | None | 0 0
  1. /**
  2.  * N = tamanho do vetor arr
  3.  * In this code we have a very large array called arr, and very large set of operations
  4.  * Build tree: build_tree(1, 0, N-1)  // padrão
  5.  * Update tree: update_tree(1, 0, N-1, i, j, value) (i,j) intervalo de (0, N-1) (value) valor a ser somado/setado/etc
  6.  * Query tree: query_tree(1, 0, N-1, i, j)  (i,j) intervalo (0, N-1)
  7.  * (1, 0, N-1) das 3 funções, padrão.
  8.  */
  9.  
  10. #include <iostream>
  11. #include <algorithm>
  12. #include <string.h>
  13. #include <math.h>
  14. #include <stdio.h>
  15.  
  16. #define NMAX 1000009 // tamanho max do vetor(arr)
  17. #define inf 0x7fffffff
  18. #define MAX 5100000 // tamanho da Arvore(tree) (int)(2 * pow(2.0, floor((log((double)N) / log(2.0)) + 1)));
  19.  
  20. typedef long long ll;
  21.  
  22. using namespace std;
  23.  
  24. int arr[NMAX];  // armazena os valores da entrada
  25. int tree[MAX];
  26. ll N;
  27.  
  28. void build_tree(int node, int a, int b) {
  29.      
  30.     if(a > b) return; // fora do intervalo
  31.      
  32.     if(a == b) { // nó folha
  33.         tree[node] = arr[a]; // Init value
  34.         return;
  35.     }
  36.    
  37.     int left = node*2, right = node*2+1, mid = (a+b)/2;
  38.      
  39.     build_tree(left, a, mid); // Init left child
  40.     build_tree(right, 1+mid, b); // Init right child
  41.      
  42.     tree[node] = max(tree[left], tree[right]); // Init root value exemplo min
  43.    // tree[node] = tree[left] * tree[right]; /// MODIFICA AQUI(max,min,soma,mult,etc);
  44. }
  45.  
  46.  
  47. void update_tree(int node, int a, int b, int i, int j, int value) {
  48.      
  49.     if(a > b || a > j || b < i) // Current segment is not within range [i, j]
  50.         return;
  51.      
  52.     if(a == b) { // Nó folha
  53.             tree[node] = value;  // Aqui é onde acontece o update MODIFICAR!!
  54.             return;               // tree[node] += value;   etc
  55.     }
  56.    
  57.     int left = node*2, right = node*2+1, mid = (a+b)/2;
  58.  
  59.     update_tree(left, a, mid, i, j, value); // Updating left child
  60.     update_tree(right, 1+mid, b, i, j, value); // Updating right child
  61.  
  62.     tree[node] = max(tree[node*2], tree[node*2+1]); // Updating root with min value
  63.    // tree[node] = tree[left] * tree[right];  // MODIFICA AQUI(max,min,soma,mult,etc);
  64. }
  65.  
  66.  
  67. int query_tree(int node, int a, int b, int i, int j) {
  68.      
  69.     if(a > b || a > j || b < i) return -inf; // Out of range
  70.  
  71.     if(a >= i && b <= j) // Current segment is totally within range [i, j]
  72.         return tree[node];
  73.        
  74.     int left = node*2, right = node*2+1, mid = (a+b)/2;
  75.  
  76.     int q1 = query_tree(left, a, mid, i, j); // Query left child
  77.     int q2 = query_tree(right, 1+mid, b, i, j); // Query right child
  78.      
  79.     if(q1 == -inf) return q2;
  80.     if(q2 == -inf) return q1;
  81.      
  82.     int res = max(q1, q2); // Return final result
  83.     //int res = q1 * q2;  // MODIFICA AQUI(max,min,soma,mult,etc)
  84.      
  85.     return res;
  86. }
  87.  
  88. int main() {
  89.      
  90.         ll t, s, k;
  91.      
  92.         scanf("%lld",&t);
  93.        
  94.         while(t--){
  95.            
  96.             scanf("%lld%lld%lld",&N,&k,&s);
  97.             arr[0] = s;
  98.                
  99.             for (int i = 1; i < N; ++i)
  100.                  arr[i] = (1LL*arr[i-1]*1103515245 + 12345) % (2147483648LL);
  101.            
  102.             build_tree(1, 0, N-1);  // constói a arvore
  103.            
  104.             ll ans, soma = 0;
  105.          
  106.             int fim = N-k+1;
  107.          
  108.             for(int i=0; i<fim; i++){              
  109.                  ll ans = query_tree(1, 0, N-1, i, i+k-1);
  110.                  soma += ans;
  111.             }
  112.          
  113.             printf("%lld\n",soma);
  114.    
  115.         }
  116.      
  117.         return 0;
  118. }
Advertisement
Add Comment
Please, Sign In to add comment