Cod sursa(job #216285)

Utilizator CezarMocanCezar Mocan CezarMocan Data 23 octombrie 2008 20:10:55
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int a, b, c, i, j, n, m, rez;

int v[100100], x[100100];

int lsb(int x) {
    return (x&(x-1))^x;    
}

void update(int a, int b) {
    while (a<=n) {
        x[a] += b;    
        a += lsb(a);
    }        
}

int query(int a) {
    int r=0;
    while (a) {
        r += x[a];
        a -= lsb(a);        
    }
   return r;
}

int bsearch(int l, int r) {
    int m = (l + r) / 2, p = query(m);

    if ( p == b )
        return m;
        
    if (l>=r)
        return -1;
        
    if (p < b)
        return bsearch(m+1, r);
    else
        return bsearch(l, m-1);
}

int main(){
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    
    scanf("%d%d", &n, &m);
    
    for (i=1; i<=n; i++) {
        scanf("%d", &v[i]);
        update(i, v[i]);
    }
    
    for (i=1; i<=m; i++) {
        scanf("%d%d", &a, &b);
        
        rez=0;
        if (a==0) {
            scanf("%d", &c);
            update(b, c);
        }
            
        if (a==1) {
            scanf("%d", &c);            
            rez = query(c) - query(b-1);       
        }
            
        if (a==2)
            rez = bsearch(1, n);
        if (a)
            printf("%d\n", rez);
    }
        

    return 0;
}