Cod sursa(job #1265087)

Utilizator TibiraducanuTiberiu Raducanu Tibiraducanu Data 16 noiembrie 2014 18:24:10
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
using namespace std;
const int NMAX = 100002;
int aib[NMAX+1];
int n;
int lsb(int x)
{
    return x&(-x);
}
void update(int poz, int val) {
    for(int i = poz; i <= n; i += lsb(i))
        aib[i] += val;

}
int query(int poz) {
    int ans = 0;
    while(poz) {
        ans += aib[poz];
        poz -= lsb(poz);
    }
    return ans;
}
int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    int m,poz,val,op,i,x,in,sf,mij,a,b;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
     scanf("%d",&x);
    // printf("%d ",x);
     update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d",&op);
        if(op==0)
        {
            scanf("%d%d",&poz,&val);
            update(poz,val);
        }
        if(op==1)
        {
            scanf("%d%d",&a,&b);
            printf("%d\n",(query(b)-query(a-1)));
        }
        if(op==2)
        {
            scanf("%d",&val);
            in=1;
            sf=n;
            while(in<=sf)
            {
                mij=(in+sf)/2;
                if(query(mij)==val)
                {
                    printf("%d\n",mij);
                    break;
                }
                if(query(mij)<val) in=mij+1;
                if(query(mij)>val) sf=mij-1;
            }
        }
    }
    return 0;
}