Cod sursa(job #3297318)

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

#define int long long

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 );
      st--;

      int ret = 0;
      for( int ii = st; ii; ii &= (ii - 1) )
        ret -= aib[ii];
      for( int ii = dr; ii; ii &= (ii - 1) )
        ret += aib[ii];

      fprintf( fout, "%lld\n", ret );
    }else{
      int x;
      fscanf( fin, "%lld", &x );

      int idx = 0;
      for( int p2 = (1 << 19); p2; p2 >>= 1 )
        if( idx + p2 <= n && aib[idx + p2] <= x ){
          idx += p2;
          x -= aib[idx];
        }

      fprintf( fout, "%lld\n", x == 0 ? (idx) : -1 );
    }
  }

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