Cod sursa(job #3279385)

Utilizator pacelaaaCiurea Pavel pacelaaa Data 22 februarie 2025 19:38:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

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

#define cin fin
#define cout fout

int aib[100001];
int n;

int quer ( int poz ) {
  if ( poz == 0 )
    return 0;
  int sum = 0;

  sum += aib[poz];
  sum += quer( poz - (poz & (-poz )) );

  return sum;
}

int query( int l, int r ) {
  return quer( r ) - quer( l - 1 );
}

void update( int poz, int val ) {
  if ( poz > n )
    return;
  aib[poz] += val;
  update( poz + ( poz & (-poz)), val);
}

int main()
{
    ios_base::sync_with_stdio( false );
    cin.tie( NULL );
    cout.tie( NULL );

    int m, i, operatie, val, poz, l, r, mij;

    cin >> n >> m;
    for ( i = 1; i <= n; i ++ ) {
      cin >> val;
      aib[i] += val;
      if ( i + (i & (-i)) <= n )
        aib[ i + (i & (-i)) ] += aib[i];
    }

    for ( int j = 0; j < m; j ++ ) {
      cin >> operatie;
      if ( operatie == 0 ) {
        cin >> poz >> val;
        update( poz, val );
      } else if ( operatie == 1 ) {
        cin >> poz >> val;
        cout << query( poz, val ) << "\n";
      } else {
        cin >> val;
        l = 0;
        r = n;
        while ( l < r - 1) {
          mij = ( l + r )/2;
          if ( query( 1, mij ) < val )
            l = mij;
          else
            r = mij;
        }
        if ( query( 1, r ) == val )
          cout << r << "\n";
        else
          cout << -1 << "\n";
      }
    }

    return 0;
}