Cod sursa(job #2930550)

Utilizator raresgherasaRares Gherasa raresgherasa Data 28 octombrie 2022 17:46:47
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;

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

const int kN = 1e5 + 5;

int fen[4 * kN];
int q, n;

void update (int bit, int x){
  for (; bit <= n; bit += -bit & bit){
    fen[bit] += x;
  }
}

int query (int bit){
  int ans = 0;
  for (; bit > 0; bit -= -bit & bit){
    ans += fen[bit];
  }
  return ans;
}

int main(){
  fin >> n >> q;
  for (int i = 1; i <= n; i++){
    int x; fin >> x;
    update(i, x);
  }
  while (q--){
    int o; fin >> o;
    if (o == 0){
      int x, y; fin >> x >> y;
      update(x, y);
    }
    if (o == 1){
      int x, y; fin >> x >> y;
      fout << query(y) - query(x - 1) << '\n';
    }
    if (o == 2){
      int a; fin >> a;
      int l = 1, r = n, ans = n;
      while (l <= r){
        int mid = l + (r - l) / 2;
        if (query(mid) >= a){
          ans = mid;
          r = mid - 1;
        }
        else{
          l = mid + 1;
        }
      }
      if (query(ans) == a){
        fout << ans << '\n';
      }
      else{
        fout << -1 << '\n';
      }
    }
  }
}