Cod sursa(job #2138700)

Utilizator NeredesinI am not real Neredesin Data 21 februarie 2018 20:31:29
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

const int NMAX = 15 * 1e3;

int n, m, t, sum;
int v[1 + NMAX];
int aint[1 + 4 * NMAX];

void update(int node, int le, int ri, int pos, int val) {
  if(le == ri) {
    aint[node] = val;
    return;
  }

  int mid = (le + ri) / 2;
  if(pos <= mid)
    update(2 * node, le, mid, pos, val);
  else
    update(2 * node + 1, mid + 1, ri, pos, val);

  aint[node] = aint[2 * node] + aint[2 * node + 1];
}

void query(int node, int le, int ri, int from, int to) {
  if(from <= le && ri <= to) {
    sum += aint[node];
    return;
  }

  int mid = (le + ri) / 2;
  if(from <= mid)
    query(2 * node, le, mid, from, to);
  if(to > mid)
    query(2 * node + 1, mid + 1, ri, from, to);
}

int main()
{
  in >> n >> m;
  for(int i = 1; i <= n; i++) {
    in >> v[i];
    update(1, 1, n, i, v[i]);
  }

  for(int i = 1; i <= m; i++) {
    int op, x, y;
    in >> op >> x >> y;

    if(op == 0) {
      v[x] -= y;
      update(1, 1, n, x, v[x]);
    } else {
      sum = 0;
      query(1, 1, n, x, y);
      out << sum << '\n';
    }
  }

  in.close();
  out.close();
  return 0;
}