Cod sursa(job #2142469)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 25 februarie 2018 02:00:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>

#define NMAX 100001

int aib [ NMAX ] ;
int v [ NMAX] ;

using namespace std;

void update (int poz, int val ) {
  for (int i = poz ; i < NMAX ; i += i & (-i) )
    aib[i] += val ;
}

int query (int poz ) {
  int answer = 0 ;
  for (int i = poz ; i > 0 ; i -= i & (-i) )
    answer += aib[i] ;
  return answer ;
}

int main()  {

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

  int n, m, i, a, b, tip, st, dr ;

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

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

  for (i = 1 ; i <= m ; i++ ) {
    fscanf (fin, "%d", &tip ) ;
    if (tip == 0 ) {
      fscanf (fin, "%d%d", &a, &b ) ;
      update (a, b ) ;
    }
    else {
      if (tip == 1 ) {
        fscanf (fin, "%d%d", &a, &b ) ;
        fprintf (fout, "%d\n", query (b) - query(a-1) ) ;
      }
      else {
        fscanf (fin, "%d", &a ) ;
        st = 1 ;
        dr = n ;
        while (st < dr ) {
          int pivot = (st + dr ) / 2 ;
          if (query (pivot) >= a )
            dr = pivot ;
          else
            st = pivot + 1 ;
        }
        if (query(st) == a )
          fprintf (fout, "%d\n", st ) ;
        else
          fprintf (fout, "-1\n" ) ;
      }
    }
  }
  return 0;
}