Cod sursa(job #1761077)

Utilizator crushackPopescu Silviu crushack Data 21 septembrie 2016 19:18:51
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
// Copyright 2016 Silviu-Emil Popescu

#include <fstream>
#include <vector>

#define zeros(x) ((x) & ((x) - 1) ^ (x))

using std::ifstream;
using std::ofstream;
using std::vector;

void update(vector<int>* _aib, size_t pos, int val) {
  vector<int>& aib = *_aib;
  for (; pos < aib.size(); pos += zeros(pos)) {
    aib[pos] += val;
  }
}

int query(const vector<int>& aib, size_t pos) {
  int ans = 0;
  for (; pos > 0; pos -= zeros(pos)) {
    ans += aib[pos];
  }
  return ans;
}

int main() {
  vector<int> aib;
  ifstream fin("datorii.in");
  ofstream fout("datorii.out");
  int n, m;

  fin >> n >> m;
  aib.resize(n + 1);
  for (int i = 1; i <= n; ++i) {
    int val;
    fin >> val;
    update(&aib, i, val);
  }

  for (int iter = 0; iter < m; ++iter) {
    int choice, a, b;
    fin >> choice >> a >> b;
    switch (choice) {
      case 1:
        fout << query(aib, b) - query(aib, a - 1) << "\n";
        break;

      case 0:
        update(&aib, a, -b);
        break;
    }
  }


  return 0;
}