Cod sursa(job #1228331)

Utilizator george_stelianChichirim George george_stelian Data 13 septembrie 2014 19:22:16
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#define putere(x) (x)&(-x)

using namespace std;

int aib[100010],n,m,i,x,y,p,a,maxlog;

void aib_update(int i,int s)
{
    for(;i<=n;i+=putere(i)) aib[i]+=s;
}

int aib_query(int i)
{
    int s=0;
    for(;i>0;i-=putere(i)) s+=aib[i];
    return s;
}

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",&x);
        aib_update(i,x);
    }
    for(maxlog=1;maxlog<=n;maxlog<<=1);
    maxlog>>=1;
    for(;m;m--)
    {
        scanf("%d%d",&p,&x);
        if(p==0)
        {
            scanf("%d",&y);
            aib_update(x,y);
        }
        else if(p==1)
        {
            scanf("%d",&y);
            printf("%d\n",aib_query(y)-aib_query(x-1));
        }
        else
        {
            a=0;
            for(i=maxlog;i;i>>=1)
            {
                if(a+i>n) continue;
                if(aib[a+i]<=x)
                {
                    a+=i;
                    x-=aib[a];
                }
            }
            if(x==0) printf("%d\n",a);
            else printf("-1\n");
        }
    }
    return 0;
}