Cod sursa(job #2611864)

Utilizator andreic06Andrei Calota andreic06 Data 7 mai 2020 18:48:18
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <cstdio>

using namespace std;
const int N = 1e5;
const int dim = 1 << 17;

int v[N+1], AIB[N+1];
int f[N+1];

char next_ch (){
    static int bp = dim;
    static char buff[dim];

    if ( bp == dim ){
      bp = 0;
      fread ( buff, 1, dim, stdin );
    }
    return buff[bp++];
}

int get () {

   int a = 0, semn = 1;
   char ch;

   while ( isspace ( ch = next_ch () ) );

   if ( ch == '-' )
     semn = -1, ch = next_ch ();

   do
     a = a * 10 + ch - '0';
   while ( isdigit ( ch = next_ch () ) );

   return a * semn;

}

static inline int zeros ( int x ){
   return ( ( x ^ ( x - 1 ) ) & x );
}

int q ( int poz ){
   int s = 0;

   for ( int i = poz; i > 0; i -= zeros ( i ) )
      s += AIB[i];
   return s;
}

void add ( int poz, int quantity, int n ){
   for ( int i = poz; i <= n; i += zeros ( i ) )
      AIB[i] += quantity;
}

int main()
{


   freopen ( "aib.in", "r", stdin );
   freopen ( "aib.out", "w", stdout );
   ios_base::sync_with_stdio ( false );
   cin.tie ( NULL );
   cout.tie ( NULL );

   int n, i, k;
   int t, CASE;

   n = get (), t = get ();
   for ( i = 1; i <= n; i ++ )
      v[i] = get (), f[i] = f[i-1] + v[i];

   for ( i = 1; i <= n; i ++ ){
      k = zeros ( i );
      AIB[i] = f[i] - f[i-k];
   }


   for ( i = 1; i <= t; i ++ ) {

      CASE = get ();

      if ( CASE == 1 ){
        int low = get (), high = get ();
        cout << q ( high ) - q ( low - 1 ) << '\n';
      }
      else if ( CASE == 0 ) {
        int poz = get (), quantity = get ();
        add ( poz, quantity, n );
      }
      else {
        int x = get ();
        int st = 1, dr = n, poz = -1;

        while ( st <= dr ) {
           int mij = st + ( dr - st ) / 2;

           if ( q ( mij ) == x )
             poz = mij, dr = mij - 1;
           else if ( q ( mij ) < x )
             st = mij + 1;
           else
             dr = mij - 1;
        }

          cout << poz << '\n';
      }
   }





   return 0;
}