Cod sursa(job #2187147)

Utilizator lulian23Tiganescu Iulian lulian23 Data 26 martie 2018 11:41:40
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>

using namespace std;

int n, m;
int S, C;
int k;
int q1, q2;
int arb[ 100010 ];

void update(int poz, int val){
     C = 0;
     while ( poz <= n ){
           arb[ poz ] += val;
           while (!(poz & (1 << C)))
            ++C;
           poz += (1 << C);
           C += 1;
     }
}


inline int Query(int poz){
    C = 0, S = 0;
    while ( poz > 0 ){
          S += arb[ poz ];
          while ( !(poz & (1<<C)) )
            ++C;
          poz -= (1<<C);
          C += 1;
    }
    return S;
}


int Search(int val)
{
    int i, step;

    for ( step = 1; step < n; step <<= 1 );

    for( i = 0; step; step >>= 1 ){
         if( i + step <= n){
            if( val >= arb[ i + step ] ){
                i += step, val -= arb[ i ];
                if ( !val ) return i;
            }
         }
    }
    return -1;
}

int main(){
    ios_base::sync_with_stdio(false);

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

    cin >> n >> m;

    for (int i = 1, x; i <= n; ++i){
        cin >> x;
        update( i, x );
    }

    for (; m; m--){
            cin >> k;

            if (k < 2){
                cin >> q1 >> q2;

                if (!k)
                    update(q1, q2);
                else
                    cout << Query(q2) - Query(q1 - 1) << '\n';
            }

        else{
            cin >> q1;
            cout << Search( q1 ) << '\n';
        }
    }
}