Cod sursa(job #2254751)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 5 octombrie 2018 22:00:18
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mp make_pair
#define CHECK(x) if(!(x)) return false;
#define CHECKRET(x, y) if(!(x)) return (y);
#define SKIP(x) if((x)) continue;
typedef pair<int, int> pii;

#ifdef INFOARENA
#define ProblemName "datorii"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

const int MAXN = 15010;
int arbInt[4 * MAXN], arbSz;

inline int parent(int x) {
  return (x - 1) >> 1;
}

inline int leftSon(int x) {
  return x * 2 + 1;
}

inline int rightSon(int x) {
  return x * 2 + 2;
}

void arbUpdate(int pos, int x) {
  for (pos += arbSz - 1; pos >= 0; arbInt[pos] += x, pos = parent(pos));
}

int query(int l, int r) {
  int ans = 0;
  for (l += arbSz - 1, r += arbSz - 1; l <= r; l = parent(l + 1), r = parent(r - 1)) {
    if (l % 2 == 0) ans += arbInt[l];
    if (r % 2 == 1) ans += arbInt[r];
  }
  return ans;
}

int main() {
  assert(freopen(InFile, "r", stdin));
  assert(freopen(OuFile, "w", stdout));
  int N, Q;
  scanf("%d%d", &N, &Q);
  for (arbSz = 1; arbSz < N; arbSz *= 2);
  for (int i = 0; i < N; ++i) {
    int x;
    scanf("%d", &x);
    arbUpdate(i, x);
  }
  while (Q--) {
    int tip, a, b;
    scanf("%d%d%d", &tip, &a, &b);
    if (tip == 0)
      arbUpdate(a - 1, -b);
    else printf("%d\n", query(a - 1, b - 1));
  }
  return 0;
}