Cod sursa(job #2718759)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 9 martie 2021 09:50:57
Problema Arbori indexati binar Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
//Ilie Dumitru
#include<cstdio>

int N, tree[100005];

void updt(int pos, int val)
{
    while(pos<=N)
    {
        tree[pos]+=val;
        pos+=(-pos)&pos;
    }
}

int sum(int pos)
{
    int s=0;
    while(pos)
    {
        s+=tree[pos];
        pos-=(-pos)&pos;
    }
    return s;
}

int binsrc(int s)
{
    int pos, bit, best=-1;
    for(bit=1;bit<=N;bit<<=1);
    bit>>=1;
    for(pos=0;bit;bit>>=1)
    {
        pos+=bit;
        if(s==tree[pos])
        {
            best=pos;
            s=0;
            pos-=bit;
        }
        else
        {
            if(s<tree[pos])
                pos-=bit;
            else
                s-=tree[pos];
        }
    }
    return best;
}

int main()
{
    int M, k, i, a, b;
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%i%i", &N, &M);
    for(i=1;i<=N;++i)
    {
        scanf("%i", &a);
        updt(i, a);
    }
    while(M--)
    {
        scanf("%i", &k);
        if(k==2)
        {
            scanf("%i", &a);
            printf("%i\n", binsrc(a));
        }
        else
        {
            scanf("%i%i", &a, &b);
            if(k)
                printf("%i\n", sum(b)-sum(a-1));
            else
                updt(a, b);
        }
    }
}