Cod sursa(job #1812610)

Utilizator penetavyPene Cosmin-Octavian penetavy Data 22 noiembrie 2016 11:13:39
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>

#define MAX_N 15000

using namespace std;

FILE *fin = fopen("datorii.in", "r");
FILE *fout = fopen("datorii.out", "w");

int N, M;
int v[MAX_N + 1];
int arbint[4 * MAX_N + 1];
int maxim;

int MAX(int a, int b) {
  return a > b ? a : b;
}

void build(int node, int left, int right) {
  if (left == right) {
    arbint[node] = v[left];
    return;
  }

  int mid = (left + right) / 2;
  build(2 * node, left, mid);
  build(2 * node + 1, mid + 1, right);
  arbint[node] = arbint[node * 2] + arbint[node * 2 + 1];
}

void update(int node, int left, int right, int pos, int val) {
  if (left == right) {
    arbint[node] -= val;
    return;
  }

  int mid = (left + right) / 2;
  if (pos <= mid) {
    update(2 * node, left, mid, pos, val);
  }
  else {
    update(2 * node + 1, mid + 1, right, pos, val);
  }
  arbint[node] = arbint[node * 2] + arbint[node * 2 + 1];
}

void querry(int node, int left, int right, int a, int b) {
  if (a <= left && right <= b) {
    maxim += arbint[node];
    return;
  }
  int mid = (left + right) / 2;
  if (a <= mid)
    querry(node * 2, left, mid, a, b);
  if (b > mid)
    querry(node * 2 + 1, mid + 1, right, a, b);
}

int main(){
  int i, j;
  int type, a, b;
  int sol;

  fscanf(fin, "%d %d", &N, &M);
  for (i = 1; i <= N; i++) {
    fscanf(fin, "%d", &v[i]);
  }

  build(1, 1, N);

  for (i = 1; i <= M; i++) {
    fscanf(fin, "%d %d %d", &type, &a, &b);
    if (type == 0) { /// b = valoare   a = zi
        update(1, 1, N, a, b);
    }
    else { /// suma de la a la b
        maxim = 0;
        if (a > b) {
            int aux = a;
            a = b;
            b = aux;
        }
        querry(1, 1, N, a, b);
        fprintf(fout, "%d\n", maxim);
    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}