Cod sursa(job #214901)

Utilizator EdeNNu Cred EdeN Data 16 octombrie 2008 18:58:18
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#define pas (k^(k-1))&k

int n, m, a[100001];

void recreate(int k, int val)
{
    while (k<=n)
        {
            a[k]+=val;
            k+=pas;
        }
}

int sum(int k)
{
    int s=0;
    while (k>0)
       {
           s+=a[k];
           k-=pas;
       }
    return s;
}

int seesum(int a)
{
    int i;
    for (i=1; i<=n; i++)
        {
            if (sum(i)==a) return i;
            if (sum(i)>a) return -1;
        }
}

void parc()
{
    int a, b, x;
    while (m>0)
        {
            scanf("%d", &x);
            if (x==0)
                {
                    scanf("%d" "%d", &a, &b);
                    recreate(a,b);
                }
            if (x==1)
                {
                    scanf("%d" "%d", &a, &b);
                    printf("%d\n", sum(b)-sum(a-1));
                }
            if (x==2)
                {
                    scanf("%d", &a);
                    printf("%d\n", seesum(a));
                }
            m--;
        }
}

void readit()
{
    int val, i;
    scanf("%d" "%d", &n, &m);
    for (i=1; i<=n; i++)
        {
            scanf("%d", &val);
            recreate(i,val);
        }
}

int main()
{
    int i;
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    readit();
    parc();
    return 0;
}