Cod sursa(job #2947789)

Utilizator RolandPetreanPetrean Roland RolandPetrean Data 26 noiembrie 2022 18:11:46
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
// https://www.infoarena.ro/problema/datorii
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

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

const int MAXN=60000;
int a[MAXN];

void build(int nod, int l, int r) {
  if (l==r) fin>>a[nod];
  else {
    int mid=(l+r)/2;
    build(2*nod, l, mid);
    build(2*nod+1, mid+1, r);
    a[nod] = a[2*nod]+a[2*nod+1];
  }
}

void update(int nod, int l, int r, int pos, int val) {
  if (l==r) a[nod] -= val;
  else {
    int mid=(l+r)/2;
    if (pos<=mid) update(2*nod, l, mid, pos, val);
    else update(2*nod+1, mid+1, r, pos, val);
    a[nod] = a[2*nod]+a[2*nod+1];
  }
}

int query(int nod, int l, int r, int ql, int qr) {
  if (l >= ql && r <= qr) return a[nod];
  
  int mid = (l+r)/2, s=0;
  if (ql<=mid) s += query(2*nod, l, mid, ql, qr);
  if (mid<qr) s += query(2*nod+1, mid+1, r, ql, qr);

  return s;
}

int main() {
  int n, m;
  fin>>n>>m;

  build(1, 1, n);

  for (int i=0; i<m; ++i) {
    int op, a, b;
    fin>>op>>a>>b;
    if (op==0) update(1, 1, n, a, b);
    else fout<<query(1, 1, n, a, b)<<endl;
  }
}