Cod sursa(job #3352131)

Utilizator marap2011Paun Mara marap2011 Data 24 aprilie 2026 11:51:33
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;

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

vector < long long > aib ;
int n ;

void update ( int ind , long long val )
{
    for ( int i = ind ; i <= n ; i += i & ( -i ) )
        aib[i] += val ;
}

long long query ( int ind )
{
    long long sum = 0 ;
    for ( int i = ind ; i >= 1 ; i -= i & ( -i) )
        sum += aib[i] ;
    return sum ;
}

int main()
{
    int q ;
    fin >> n >> q ;
    aib.resize(n+1) ;
    for ( int i = 1 ; i <= n ; i ++ )
    {
        long long x ;
        fin >> x ;
        update ( i , x ) ;
    }
    while ( q -- )
    {
        int caz ;
        fin >> caz ;
        if ( caz == 0 )
        {
            int ind ;
            long long val ;
            fin >> ind >> val ;
            update ( ind , val ) ;
        }
        else if ( caz == 1 )
        {
            int st , dr ;
            fin >> st >> dr ;
            long long sum = query ( dr ) ;
            sum -= query ( st - 1 ) ;
            fout << sum << '\n' ;
        }
        else
        {
            long long a ;
            fin >> a ;
            int st = 1 , dr = n , poz = -1 ;
            while ( st <= dr )
            {
                int mid = ( st + dr ) / 2 ;
                long long sum = query ( mid ) ;
                if ( sum == a )
                {
                    poz = mid ;
                    break ;
                }
                else if ( sum < a )
                    st = mid + 1 ;
                else
                    dr = mid - 1 ;
            }
            fout << poz << '\n' ;
        }
    }

    return 0;
}