Cod sursa(job #1375027)

Utilizator superman_01Avramescu Cristian superman_01 Data 5 martie 2015 11:47:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <iostream>

#define NMAX 100005
#define lsb(i) i&(-i)
#define get_max(a,b)  ((a)>(b)?(a):(b))
#define get_min(a,b)  ((a)<(b)?(a):(b))

using namespace std;

ifstream in ( "aib.in" );
ofstream out ( "aib.out" );

int N , M ;
int AIB[NMAX];

void Update ( int Pos , int Value ){
   int i;
   for ( i = Pos ; i <= N  ; i += lsb(i) )
     AIB[i] += Value;
}

int Search ( int Pos ){
   int Answer = 0  ;
   int i ;
   for ( i = Pos ; i > 0 ; i -= lsb(i ))
           Answer += AIB[i];
    return Answer;
}
int BinarySearch ( int A ){
    int left = 1  , Sol , right = N , value ;
    int middle = ( 1 + N ) / 2;
    bool ok = true;
    while ( left <= right ){
        middle = ( left +right )  / 2;
       value = Search( middle );
       if ( value == A )
       return middle; else
       if ( value >  A) right = middle - 1;
        else if ( value < A)left = middle +1;
   }

   return -1;
}


int main ( void ){

    int i , j ;
    int type , A , B;
    in >> N >> M ;

    for ( i = 1 ; i <= N ; ++i )
        in >> A,
        Update ( i , A);

    for ( i = 1 ; i <= M ; ++i ){
      in >> type >> A;
        if ( type == 2 ){
          out << BinarySearch(A) << "\n";
        }else{
          in >> B;
          if ( type == 1 )
          out << Search(B) - Search(A-1) << "\n";
          else Update ( A , B) ;
        }

    }
    in.close();
    out.close();
    return 0 ;
}