Cod sursa(job #3297473)

Utilizator Arhiva_Educationala_2Arhiva Educationala doi Arhiva_Educationala_2 Data 22 mai 2025 17:49:00
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

#define int long long

int range_sum( const std::vector<int> &aib, int st, int dr ) {
  int ret = 0;
  st--;
  for( int ii = st; ii; ii &= (ii - 1) )
    ret -= aib[ii];
  for( int ii = dr; ii; ii &= (ii - 1) )
    ret += aib[ii];
  return ret;
}

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

  int n, m;
  fscanf( fin, "%lld%lld", &n, &m );

  std::vector<int> v(n);
  for( int i = 0; i < n; i++ )
    fscanf( fin, "%lld", &v[i] );

  std::vector<int> aib(n + 1, 0);
  for( int i = 1; i <= n; i++ ){
    int x = v[i - 1];
    for( int ii = i; ii <= n; ii += (ii & -ii) )
      aib[ii] += x;
  }

  for( int i = 0; i < m; i++ ){
    int task;
    fscanf( fin, "%lld", &task );
    if( task == 0 ){
      int idx, delta;
      fscanf( fin, "%lld%lld", &idx, &delta );
      for( int ii = idx; ii <= n; ii += (ii & -ii) )
        aib[ii] += delta;
    }else if( task == 1 ){
      int st, dr;
      fscanf( fin, "%lld%lld", &st, &dr );
      fprintf( fout, "%lld\n", range_sum( aib, st, dr ) );
    }else{
      int x;
      fscanf( fin, "%lld", &x );

      int idx = 0;
      for( int p2 = (1 << 19); p2; p2 >>= 1 )
        if( idx + p2 <= n && range_sum( aib, 1, idx + p2 ) < x )
          idx += p2;

      idx++;
      if( range_sum( aib, 1, idx ) == x )
        fprintf( fout, "%lld\n", idx );
      else
        fprintf( fout, "-1\n" );
    }
  }

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