Cod sursa(job #751542)

Utilizator test1Trying Here test1 Data 26 mai 2012 12:16:25
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define TEST 0
#define MAX 100001

int aib[MAX],n,m;

void open(){
    if(TEST)
    {
        freopen("test.in","r",stdin);
        freopen("test.out","w",stdout);
    } else {
        freopen("aib.in","r",stdin);
        freopen("aib.out","w",stdout);
    }
}

void update(int idx,int val){
    while(idx<=n)
    {
        aib[idx]+=val;
        idx+=idx&-idx;
    }
}

int read(int idx){
    int sum = 0;
    while(idx > 0)
    {
        sum+=aib[idx];
        idx-=idx&-idx;
    }
    return sum;
}

int caut_bin(int x){
    int l = 1,r = n, md;
    while(l < r)
    {
        md = (l + r) / 2;
        if(read(md) >= x)r = md; else l = md + 1;
    }
    return read(r) == x ? r : -1;
}

int main(){
    int c,x,y;
    open();

    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&c);
        if(c == 2)
        {
            scanf("%d",&x);
            printf("%d\n",caut_bin(x));
        } else {
        scanf("%d %d",&x,&y);
        if(c == 0)update(x,y); else printf("%d\n",read(y)-read(x-1));
        }
    }
    return 0;
}