Cod sursa(job #2175359)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 16 martie 2018 16:51:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>

using namespace std;

int n,logn,aib[100010];

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

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

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    int m,tip,x,a,b;
    scanf("%d%d",&n,&m);
    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",&tip,&a);
        if(tip==0)
        {
            scanf("%d",&b);
            update(a,b);
        }
        else if(tip==1)
        {
            scanf("%d",&b);
            printf("%d\n",query(b)-query(a-1));
        }
        else
        {
            int poz=caut_bin(a);
            if(query(poz)==a) printf("%d\n",poz);
            else printf("-1\n");
        }
    }
    return 0;
}