Cod sursa(job #3248307)

Utilizator Daria1809Padure Daria Daria1809 Data 11 octombrie 2024 15:14:28
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <stdio.h>
#include <fstream>
using namespace std;
#define MAXN 100000
int n;
int v[MAXN + 1];
void update( int poz, int val ) {
    int c = 0;
    while ( poz <= n ) {
        v[poz] += val;
        while ( !(poz & (1<<c)) )
            c++;
        poz += (1<<c);
        c++;
    }
}
int query( int poz ) {
    int c = 0, s = 0;
    while ( poz > 0 ) {
        s += v[poz];
        while ( !(poz & (1<<c)) )
            c++;
          poz -= (1<<c);
          c++;
    }
    return s;
}
int cautare( int sum )
{
    int pos = n+1, b, c, s;
    int limst=0, limdr=n+1;
    b = n;
    s = query( b );
    if ( s == sum )
        pos = n;
    while ( b ) {
        b = ( limst + limdr )>>1;
        s = query( b );
        if ( s > sum ) {
            if ( limdr > b )
                limdr = b;
            b--;
        }
        else if ( s == sum ) {
            pos = min( pos, b );
            limdr = b;
            b--;
        }
        else
        {
            if ( limst < b )
                limst = b;
            b++;
        }
        if ( b <= limst ) break;
        if ( b >= limdr ) break;
    }
    if ( pos == n+1 )
        return -1;
    return pos;
}

int main()
{
    ifstream fin( "aib.in" );
    ofstream fout( "aib.out" );
    int k, i, t, x, y, m;
    fin >> n >> m;
    for ( i = 1; i <= n; i++ ) {
        fin >> t;
        update(i,t);
    }
    for ( i = 0; i < m; i++ ) {
        fin >> k;

        if ( k < 2 ) {
             fin >> x >> y;
             if ( k == 0 )
                update(x, y);
             else
                fout << query(y) - query(x-1) << '\n';
        }
        else {
            fin >> x;
            fout << cautare( x ) << '\n';
        }
    }
    return 0;
}