Cod sursa(job #2769236)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 14 august 2021 12:04:04
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
//Ilie Dumitru
#include<cstdio>
const int NMAX=100005;

int N, Arb[NMAX];

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

int query(int x)
{
    int S=0;
    while(x)
    {
        S+=Arb[x];
        x&=x-1;
    }
    return S;
}

int src(int x)
{
    int i, bit;
    bit=1<<(31-__builtin_clz(N));
    for(i=0;bit;bit>>=1)
    {
        if(i+bit<=N && Arb[i+bit]<=x)
        {
            i+=bit;
            x-=Arb[i];
            if(!x)
                return i;
        }
    }
    return -1;
}

int main()
{
    int i, val, op, a, b, q;
    FILE *f=fopen("aib.in", "r"), *g=fopen("aib.out", "w");
    fscanf(f, "%d%d", &N, &q);
    for(i=1;i<=N;++i)
    {
        fscanf(f, "%d", &val);
        updt(i, val);
    }
    while(q--)
    {
        fscanf(f, "%d%d", &op, &a);
        if(op==2)
            fprintf(g, "%d\n", src(a));
        else
        {
            fscanf(f, "%d", &b);
            if(op)
                fprintf(g, "%d\n", query(b)-query(a-1));
            else
                updt(a, b);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}