Cod sursa(job #1919942)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 9 martie 2017 21:41:30
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>

using namespace std;

int n,logn,aib[100010];

void aib_update(int poz,int val)
{
    for(int i=poz;i<=n;i+=i&(-i))
        aib[i]+=val;
}

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

int caut_bin(int val)
{
    int poz=0;
    for(int i=logn;i>=0;i--)
        if(poz+(1<<i)<=n && aib[poz+(1<<i)]<val)
        {
            poz+=(1<<i);
            val-=aib[poz];
        }
    poz++;
    return poz;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,tip,a,b;
    scanf("%d%d",&n,&m);
    while((1<<logn)<=n) logn++;
    logn--;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a);
        aib_update(i,a);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&tip);
        if(tip==2) {scanf("%d",&a);printf("%d\n",caut_bin(a));}
        else
        {
            scanf("%d%d",&a,&b);
            if(tip==0) aib_update(a,b);
            else printf("%d\n",aib_query(b)-aib_query(a-1));
        }
    }
    return 0;
}