Cod sursa(job #2930411)

Utilizator raresgherasaRares Gherasa raresgherasa Data 28 octombrie 2022 13:19:58
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

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

const int kN = 15e3 + 5;

int arb[4 * kN], a[4 * kN];
int n, m;

void build (int nod, int st, int dr){
  if (st == dr){
    arb[nod] = a[st];
  }
  else{
    int mij = (st + dr) / 2;
    build(2 * nod, st, mij);
    build(2 * nod + 1, mij + 1, dr);
    arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
  }
}

void update (int nod, int st, int dr, int poz, int val){
  if (st == dr){
    arb[nod] += val;
  }
  else{
    int mij = (st + dr) / 2;
    if (poz <= mij){
      update(nod * 2, st, mij, poz, val);
    }
    else{
      update(nod * 2 + 1, mij + 1, dr, poz, val);
    }
    arb[nod] = arb[2 * nod] + arb[2 * nod + 1];
  }
}

int query (int nod, int st, int dr, int Qst, int Qdr){
  if (Qst <= st && dr <= Qdr){
    return arb[nod];
  }
  else{
    int mij = (st + dr) / 2;
    int p = 0, q = 0;
    if (Qst <= mij){
       p = query(2 * nod, st, mij, Qst, Qdr);
    }
    if (mij + 1 <= Qdr){
      q = query(2 * nod + 1, mij + 1, dr, Qst, Qdr);
    }
    return p + q;
  }
}

int main(){
  fin >> n >> m;
  for (int i = 1; i <= n; i++){
    fin >> a[i];
  }
  build(1, 1, n);
  while (m--){
    int o, x, y; fin >> o >> x >> y;
    if (o == 0){
      update(1, 1, n, x, -y);
    }
    else{
      fout << query(1, 1, n, x, y) << '\n';
    }
  }
}