Cod sursa(job #3240288)

Utilizator DariusHHanganu Darius DariusH Data 13 august 2024 19:54:26
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>

using namespace std;

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

#define N_MAX 150001

int aib[N_MAX];
int n;

void update(int pos, int delta) {
  while(pos <= n) {
    aib[pos] += delta;
    pos += (pos & (-pos));
  }
}

int query(int pos) {
  int res = 0;
  while(pos > 0) {
    res += aib[pos];
    pos -= (pos & (-pos));
  }
  return res;
}

int main()
{
  int m, val, q, a, b, st, dr, mid, i;
  fin >> n >> m;
  for(i = 1; i <= n; ++i) {
    fin >> val;
    update(i, val);
  }
  while(m--) {
    fin >> q >> a;
    if(q == 0) {
      fin >> b;
      update(a, b);
    }else if(q == 1) {
      fin >> b;
      fout << query(b) - query(a - 1) << '\n';
    }else{
      st = 1;
      dr = n;
      while(st <= dr) {
        mid = (st + dr) / 2;
        if(query(mid) >= a) {
          dr = mid - 1;
        }else{
          st = mid + 1;
        }
      }

      if(query(st) == a) {
        fout << st << '\n';
      }else{
        fout << "-1\n";
      }
    }
  }
  return 0;
}