Cod sursa(job #607589)

Utilizator PatrunjeluMarginean Bogdan Alexandru Patrunjelu Data 12 august 2011 18:26:05
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#define aib(x) ((x^(x-1))& x)
using namespace std;
const int maxn = 100000;

int n,m;
int array[maxn];

void add(int pos, int amount)
{
    for (int i = pos; i<=n; i+=aib(i))
    {
        array[i] += amount;
    }
}

long sum(int count)
{
    long sum = 0;
    for (int i = count; i > 0; i-=aib(i))
    {
        sum+=array[i];
    }
    return sum;
}

int myQuery(int a)
{
    int sec = 1;
    while ((sum(sec) != a) && (sec <= n))
    {
        ++sec;
    }
    return sec;
}

int main()
{
    freopen("aib.in","r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d", &n, &m);
    int sec, sec2, sec3;
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &sec);
        add(i, sec);
    }
    for (int i = 0; i < m; ++i)
    {
        scanf("%d", &sec);
        if (sec == 2)
        {
            scanf("%d", &sec2);
            printf("%d\n", myQuery(sec2));
        }
        else
        {
            if (sec == 0)
            {
                scanf("%d%d", &sec2, &sec3);
                add(sec2, sec3);
            }
            else
            {
                scanf("%d%d", &sec2, &sec3);
                printf("%ld\n", sum(sec3) - sum(sec2 - 1));
            }
        }
    }
    return 0;
}