Cod sursa(job #1204557)

Utilizator cameleonGeorgescu Dan cameleon Data 3 iulie 2014 12:17:21
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>

using namespace std;
#define Nmax 100005
int aib[Nmax],x,n,m;
void update( int poz,int x)
{
    aib[poz]+=x;
    int lsb=poz&(-poz);
    while(poz+lsb<=n){
        poz+=lsb;
        aib[poz]+=x;
        lsb=poz&(-poz);
    }
}
int query(int poz){
    int s=aib[poz];

    int lsb=poz&(-poz);
    while(poz-lsb>0){
        poz-=lsb;
        s+=aib[poz];
        lsb=poz&(-poz);
    }
    return s;
}
int search(int s){
    int p=1,u=n,mij;
    while(p<=u){
        mij=(p+u)/2;
        int rez=query(mij);
        if(s==rez) return mij;
        else
            if(s<rez)u=mij-1;
            else p=mij+1;
    }
    return -1;
}
int main()
{
    int op,a,b,x,y;
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    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%d",&op,&a);
            switch(op){
                case 0: scanf("%d",&b);
                        update(a,b);
                        break;
                case 1:scanf("%d",&b);
                        x=query(b);
                        y=query(a-1);
                        printf("%d\n",query(b)-query(a-1));
                        break;
                case 2:printf("%d\n",search(a));
                        break;
            }
        }
    return 0;
}