Cod sursa(job #3155548)

Utilizator Luca_Miscocilucainfoarena Luca_Miscoci Data 8 octombrie 2023 16:14:19
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <iostream>

using namespace std;

const int nmax = 1e5;
int v[nmax + 1];
long long aint[4 * nmax + 1];

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

  int mij = (left + right) >> 1;
  int leftnode = (node << 1);
  int rightnode = (node << 1) + 1;

  build (leftnode, left, mij);
  build (rightnode, mij + 1, right);

  aint[node] = aint[rightnode] + aint[leftnode];
}

void update (int node, int left, int right, int poz, int val){
  if (left == right){
    aint[node] -= val;
    return;
  }
  int mij = (left + right) >> 1;
  int leftnode = (node << 1);
  int rightnode = (node << 1) + 1;

  if (poz <= mij)
    update (leftnode, left, mij, poz, val);
  else
    update (rightnode, mij +  1, right, poz, val);

  aint[node] = aint[leftnode] + aint[rightnode];
}

int query (int node, int left, int right, int qleft, int qright){
  if (qleft == left && qright == right){
    return aint[node];
  }

  int mij = (left + right) >> 1;
  int leftnode = (node << 1);
  int rightnode = (node << 1) + 1;

  if (qright <= mij)
    return query (leftnode, left, mij, qleft, qright);
  if (qleft > mij)
    return query (rightnode, mij + 1, right, qleft, qright);
  return query (leftnode, left, mij, qleft, mij) + query (rightnode, mij + 1, right, mij + 1, qright);
}

signed main(){

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

  int n, q;
  fin >> n >> q;

  for (int i = 1; i <= n; i++){
    fin >> v[i];
  }
      build (1, 1, n);


  int qst, qdr;
  int type;
  int val;
  int poz;
  for (int i = 1; i <= q; i++){
    fin >> type;
    if (type == 0){
      fin >> poz >> val;
      update (1, 1, n, poz, val);
    }
    else {
      fin >> qst >> qdr;
      fout << query(1, 1, n, qst, qdr) << "\n";

    }
  }

  return 0;
}