Cod sursa(job #1456619)

Utilizator cristina_borzaCristina Borza cristina_borza Data 1 iulie 2015 13:38:03
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <cstdio>

using namespace std;

int sol[100001] , n , m , a , b , tip;

void caut(int val) ;
int query(int poz) ;
void update(int poz , int val) ;

int main()
{
    freopen("aib.in" , "r" , stdin) ;
    freopen("aib.out" , "w" , stdout) ;
    scanf("%d %d" , &n , &m) ;
    for(int i = 1 ; i <= n ; ++i){
        scanf("%d" , &a) ;
        update(i , a);
    }
    for(int i = 1 ; i <= m ; ++i){
        scanf("%d" , &tip);
        if(tip == 0){
            scanf("%d %d" , &a , &b) ;
            update(a , b) ;
        }
        else{
            if(tip == 1){
                scanf("%d %d" , &a , &b) ;
                printf("%d\n" , query(b) - query(a - 1)) ;
            }
            else{
                scanf("%d" , &a) ;
                caut(a) ;
            }
        }
    }
    return 0;
}

void update(int poz , int val){
    while(poz <= n){
        sol[poz] += val ;
        poz += poz & (poz ^ (poz - 1)) ;
    }
}
int query(int poz){
    int sum = 0 ;
    while(poz >= 1){
        sum += sol[poz] ;
        poz -= poz & (poz ^ (poz - 1)) ;
    }
    return sum ;
}
void caut(int val){
    int i , p = 0 ;
    for(i = 1 ; i <= n ; i <<= 1) ;
    while(i){
        if(i + p <= n){
            if(val >= sol[i + p]){
                val -= sol[i + p] ;
                p += i ;
                if(val == 0){
                    printf("%d\n" , p) ;
                    return ;
                }
            }
        }
        i /= 2 ;
    }
    printf("-1\n");
    return ;
}