Cod sursa(job #2589559)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 26 martie 2020 16:10:56
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 NMAX = 1e5;

int aib[NMAX + 1], n;

int query( int p ) {
  long long s = 0;
  for( ; p > 0; p -= p & (-p) )
    s += aib[p];
  return s;
}

void update( int p, int val ) {
  for( ; p <= n; p += p & (-p) )
    aib[p] += val;
}

int cb( int x ) {
  if( x == 0 )
    return -1;
  int pas;
  for( pas = 1; pas <= n; pas *= 2 );
  int r = 0;
  while( pas ) {
    if( r + pas <= n && aib[r + pas] <= x ) {
      x -= aib[r + pas];
      r += pas;
    }
    pas /= 2;
  }
  if( x > 0 )
    return -1;
  return r;
}

int main() {
    int m, tip, a, b;
    fin>>n>>m;
    for( int i = 1; i <= n; i ++ ) {
      int x;
      fin>>x;
      update(i, x);
    }
    while( m -- ) {
      fin>>tip;
      if( tip == 0 ) {
        int a, b;
        fin>>a>>b;
        update(a, b);
      }
      else if( tip == 1 ) {
        fin>>a>>b;
        fout<<query(b) - query(a - 1)<<"\n";
      }
      else {
        fin>>a;
        fout<<cb(a)<<"\n";
      }
    }
    return 0;
}