Cod sursa(job #2937584)

Utilizator average_disappointmentManolache Sebastian average_disappointment Data 10 noiembrie 2022 17:57:26
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>

using namespace std;

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

const int nmax = 15000;
int n, m, aint[nmax * 4];

void act(int curr_node, int loc_left, int loc_right, int left, int right, int val) {

  if (left <= loc_left && loc_right <= right)
    aint[curr_node] += val;
  else {

    int mid = (loc_left + loc_right) / 2;
    if (left <= mid)
      act(curr_node * 2, loc_left, mid, left, right, val);
    if (mid < right)
      act(curr_node * 2 + 1, mid + 1, loc_right, left, right, val);
    aint[curr_node] = aint[curr_node * 2] + aint[curr_node * 2 + 1];
  }
}

int querry(int curr_node, int loc_left, int loc_right, int left, int right) {

  if (left <= loc_left && loc_right <= right)
    return aint[curr_node];
  else {

    int ans = 0, mid = (loc_left + loc_right) / 2;
    if (left <= mid)
      ans += querry(curr_node * 2, loc_left, mid, left, right);
    if (mid < right)
      ans += querry(curr_node * 2 + 1, mid + 1, loc_right, left, right);
    return ans;
  }
}

int main() {

  cin >> n >> m;
  for (int i = 1; i <= n; i++) {

    int elem;
    cin >> elem;
    act(1, 1, n, i, i, elem);
  }

  for (int i = 1; i <= m; i++) {

    int q, a, b;
    cin >> q >> a >> b;
    if (q == 0)
      act(1, 1, n, a, a, -b);
    else
      cout << querry(1, 1, n, a, b) << "\n";
  }
}