Cod sursa(job #2929462)

Utilizator Ana_22Ana Petcu Ana_22 Data 25 octombrie 2022 22:31:36
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#define NMAX 100000

int v[NMAX];
int n;

void form() {
  int i, j;
  for( i = 0; i < n; i++ ) {
    j = i | ( i + 1 );
    if( j <= n )
      v[j] += v[i];
  }
}

void increase( int poz, int dif ) {
  for( ; poz < n; poz |= ( poz + 1 ) )
    v[poz] += dif;
}

int calc( int poz ) {
  int rez = 0;
  for( ; poz >= 0; poz = ( poz & ( poz + 1 ) ) - 1 )
    rez += v[poz];
  return rez;
}

int sum( int left, int right ) {
  return calc( right ) - calc( left - 1 );
}

int cb( int elem ) {
  int st = -1, dr = n - 1, mijl;
  while( dr - st > 1 ) {
    mijl = ( st + dr ) / 2;
    if( calc( mijl ) < elem )
      st = mijl;
    else
      dr = mijl;
  }
  if( calc( dr ) != elem )
    dr = -2;
  return dr;
}

int main() {
    FILE *fin, *fout;
    int m, i, a, b, tip;
    fin = fopen( "aib.in", "r" );
    fout = fopen( "aib.out", "w" );
    fscanf( fin, "%d%d", &n, &m );
    for( i = 0; i < n; i++ )
      fscanf( fin, "%d", &v[i] );
    form();
    for( i = 0; i < m; i++ ) {
      fscanf( fin, "%d", &tip );
      if( tip == 0 ) {
        fscanf( fin, "%d%d", &a, &b );
        increase( a - 1, b );
      }
      else if( tip == 1 ) {
        fscanf( fin, "%d%d", &a, &b );
        fprintf( fout, "%d\n", sum( a - 1, b - 1 ) );
      }
      else {
        fscanf( fin, "%d", &a );
        fprintf( fout, "%d\n", cb( a ) + 1 );
      }
    }
    fclose( fin );
    fclose( fout );
    return 0;
}