Cod sursa(job #3216284)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 15 martie 2024 19:57:01
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
// Mihai Priboi

#include <stdio.h>

#define MAX_N 100000
#define LOG_N 17

int v[MAX_N + 1];

inline int lsb(int x) { return x & -x; }

void init(int n) {
  for (int i = 1; i <= n; i++)
    if (i + lsb(i) <= n)
      v[i + lsb(i)] += v[i];
}

void add(int x, int val, int n) {
  while (x <= n) {
    v[x] += val;
    x += lsb(x);
  }
}

int query(int x) {
  int r = 0;

  while (x > 0) {
    r += v[x];
    x -= lsb(x);
  }

  return r;
}

int query(int a, int b) {
  return query(b) - query(a - 1);
}

int bs(int x, int n) {
  int r, pas, s;
  r = s = 0;
  pas = 1 << LOG_N;

  while (pas) {
    if (r + pas <= n && s + v[r + pas] <= x) {
      r += pas;
      s += v[r];
    }

    pas /= 2;
  }

  return s == x ? r : -1;
}

int main() {
  FILE *fin, *fout;
  int n, q;

  fin = fopen("aib.in", "r");
  fout = fopen("aib.out", "w");

  fscanf(fin, "%d%d", &n, &q);

  for (int i = 1; i <= n; i++)
    fscanf(fin , "%d", &v[i]);

  init(n);

  while (q--) {
    int c, a, b;
    fscanf(fin, "%d%d", &c, &a);

    if (c == 0) {
      fscanf(fin, "%d", &b);
      add(a, b, n);
    } else if (c == 1) {
      fscanf(fin, "%d", &b);
      fprintf(fout, "%d\n", query(a, b));
    } else {
      fprintf(fout, "%d\n", bs(a, n));
    }
  }

  fclose(fin);
  fclose(fout);
  return 0;
}