Cod sursa(job #1894015)

Utilizator Burbon13Burbon13 Burbon13 Data 26 februarie 2017 13:12:00
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>

using namespace std;

const int nmx = 100002;

int n,tests,bit[nmx];

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

void update(int pos, int val)
{
    while(pos <= n)
    {
        bit[pos] += val;
        pos += pos & (-pos);
    }
}

void input_data()
{
    scanf("%d %d", &n, &tests);
    for(int i = 1; i <= n; ++i)
    {
        int val;
        scanf("%d", &val);
        update(i,val);
    }
}

int cautbin(int val)
{
    int st = 1, dr = n, mij;
    while(st <= dr)
    {
        mij = query((st+dr)/2);
        if(mij == val)
            return (st + dr) / 2;
        if(mij > val)
            dr = (st + dr) / 2 - 1;
        else
            st = (st + dr) / 2 + 1;
    }
    return -1;
}

void test_data()
{
    for(int i = 1; i <= tests; ++i)
    {
        int c,a,b;
        scanf("%d %d", &c, &a);
        if(c == 0)
            {
                scanf("%d", &b);
                update(a,b);
            }
        else if(c == 1)
            {
                scanf("%d", &b);
                printf("%d\n", query(b) - query(a-1));
            }
        else
            printf("%d\n", cautbin(a));
    }
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    input_data();
    test_data();

    return 0;
}