Cod sursa(job #224631)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 30 noiembrie 2008 08:55:12
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>

#define MAXN 15000

int tree[65536];
int A[16384];

void build_tree(int start_range, int end_range, int pos) {
  if (start_range == end_range) {
    tree[pos] = A[start_range];
    return;
  }

  int mid_range = (start_range + end_range) / 2;
  int left_child = pos * 2, right_child = pos * 2 + 1;
  
  build_tree(start_range, mid_range, left_child);
  build_tree(mid_range + 1, end_range, right_child);
  tree[pos] = tree[left_child] + tree[right_child];
}

void update_tree(int start_range, int end_range, int day, int ammount, int pos) {
  tree[pos] -= ammount;
  
  if (start_range == end_range)
    return;

  int mid_range = (start_range + end_range) / 2;
  int left_child = pos * 2, right_child = pos * 2 + 1;
  
  if (day <= mid_range)
    update_tree(start_range, mid_range, day, ammount, left_child);
  else
    update_tree(mid_range + 1, end_range, day, ammount, right_child);
}

int compute_number(int start_range, int end_range, int st, int en, int pos) {
  if (st == start_range && en == end_range)
    return tree[pos];

  int mid_range = (start_range + end_range) / 2;
  int left_child = pos * 2, right_child = pos * 2 + 1;

  if (en <= mid_range)
    return compute_number(start_range, mid_range, st, en, left_child);
  if (st > mid_range)
    return compute_number(mid_range + 1, end_range, st, en, right_child);

  return 
    compute_number(start_range, mid_range, st, mid_range, left_child) +
    compute_number(mid_range + 1, end_range, mid_range + 1, en, right_child);
}

int main() {
  FILE *f;
  int n ,m;

  f = fopen("datorii.in", "rt");
  fscanf(f, "%d %d", &n, &m);
  for (int i = 0; i < n; ++i)
    fscanf(f, "%d", A + i);
  
  build_tree(0, n, 1);
  
  freopen("datorii.out", "wt", stdout);

  for (int i = 0; i < m; ++i) {
    int a, b, c;
    fscanf(f, "%d %d %d", &a, &b, &c);
    if (a) 
      printf("%d\n", compute_number(0, n, b - 1, c - 1, 1));
    else
      update_tree(0, n, b - 1, c, 1);
             
  }

  return 0;
}