Cod sursa(job #2452552)

Utilizator Tudor06MusatTudor Tudor06 Data 31 august 2019 10:20:07
Problema Arbori indexati binar Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>

int aib[100000];

int zeros( int x ) { /// functia returneaza 2^(numarul de zerouri terminale din x );
  return ( x ^ ( x - 1 ) ) & x;
}

void add( int x, int quantity, int n ) {
  int i;
  i = x;
  while ( i <= n ) {
    aib[i] += quantity;
    i += zeros(i);
  }
}

int sum( int x ) {
  int i, s = 0;
  i = x;
  while ( i > 0 ) {
    s += aib[i];
    i -= zeros(i);
  }
  return s;
}

int search( int n, int x ) {
  int st, dr, mij, rez;
  st = 1;
  dr = n + 1;
  while ( dr - st > 1 ) {
    mij = ( st + dr ) / 2;
    if ( x >= sum(mij) )
      st = mij;
    else
      dr = mij;
  }
  if ( sum(st) == x )
    rez = st;
  else
    rez = -1;
  return rez;
}
int main() {
  FILE *fin = fopen( "aib.in", "r" ), *fout = fopen( "aib.out", "w" );
  int n, i, m, a, cer, j, j1;
  fscanf( fin, "%d%d", &n, &m );
  for ( i = 1; i <= n; i ++ ) {
    fscanf( fin, "%d", &a );
    add( i, a, n );
  }
  /**
  for ( i = 1; i <= n; i ++ ) {
    printf( "%d ", aib[i] );
  }
  **/
  for ( i = 0; i < m; i ++ ) {
    fscanf( fin, "%d", &cer );
    switch( cer ) {
    case 0:
      fscanf( fin, "%d%d", &j, &a );
      add( j, a, n );
      break;
    case 1:
      fscanf( fin, "%d%d", &j, &j1 );
      fprintf( fout, "%d\n", sum(j1) - sum(j - 1) );
      break;
    case 2:
      fscanf( fin, "%d", &a );
      fprintf( fout, "%d\n", search( n, a ) );
      break;
    }
  }
  return 0;
}