Cod sursa(job #3349596)

Utilizator stefan1010Stefan Bogdan stefan1010 Data 31 martie 2026 23:37:32
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
const int NMAX = 1e5 + 5;

int n, m, a, b, type;
int aib[NMAX];

int ub(int p)
{
    return (p & (-p));
}

void update(int p, int val)
{
    for (int i = p; i <= n; i += ub(i))
        aib[i] += val;
}

int sum(int p)
{
    int s = 0;
    for (int i = p; i > 0; i -= ub(i))
        s += aib[i];
    return s;
}

int cb(int val) /// cautam p a.i. suma a[1]+a[2]+....+a[p]=val
{
    int i, step;

    for (step = 1; step < n; step <<= 1)
        ;
    for (int i = 0; step; step >>= 1)
    {
        if (i + step <= b)
        {
            if (val >= aib[i + step])
            {
                i += step, val -= aib[i];
                if (!val)
                    return i;
            }
        }
    }
    return -1;
}

int main()
{
    FILE *in, *out;
    in = fopen("aib.in", "r");
    out = fopen("aib.out", "w");
    fscanf(in, "%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        int x;
        fscanf(in, "%d", &x);
        update(i, x);
    }
    for (int i = 1; i <= m; i++)
    {
        fscanf(in, "%d", &type);
        if (type == 0)
        {
            fscanf(in, "%d%d", &a, &b);
            update(a, b);
        }
        else if (type == 1)
        {
            fscanf(in, "%d%d", &a, &b);
            fprintf(out, "%d\n", (sum(b) - sum(a - 1)));
        }
        else
        {
            fscanf(in, "%d", &a);
            fprintf(out, "%d\n", cb(a));
        }
    }
    return 0;
}