Cod sursa(job #2374017)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 7 martie 2019 16:33:54
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <bits/stdc++.h>

using namespace std;

int aib[100010],n,logn;

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

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

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

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,x,t,y;
    scanf("%d%d",&n,&m);
    logn=0;
    while((1<<logn)<=n) logn++;
    logn--;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&t,&x);
        if(!t)
        {
            scanf("%d",&y);
            update(x,y);
        }
        else if(t==1)
        {
            scanf("%d",&y);
            printf("%d\n",query(y)-query(x-1));
        }
        else printf("%d\n",caut_bin(x));
    }
    return 0;
}