Cod sursa(job #1117185)

Utilizator PatrikStepan Patrik Patrik Data 23 februarie 2014 11:10:55
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
    #include<cstdio>
    using namespace std;
    #define MAX 100001
    int N , M , AIB[MAX];

    int query(int x);
    int bin(int x);
    void update(int x , int y);

    int main()
    {
        int t ,a ,b;
        freopen("aib.in" , "r" , stdin );
        freopen("aib.out" , "w" , stdout );
        scanf("%d%d" , &N  , &M );
        for(int i = 1 ; i<= N ; ++i )
        {
            scanf("%d" , &a);
            update(i,a);
        }
        for(int i = 1 ; i<= M ; ++i )
        {
            scanf("%d" , &t );
            if(t == 0)
            {
                scanf("%d%d" , &a , &b);
                update(a,b);
            }
            if(t == 1)
            {
                scanf("%d%d" , &a , &b );
                printf("%d\n" , query(b)-query(a-1));
            }
            if(t == 2)
            {
                scanf("%d" , &a);
                printf("%d\n" , bin(a));
            }
        }
        return 0;
    }

    void update(int a , int b)
    {
        int k = 0;
        while(a <= N)
        {
            AIB[a] += b;
            while(!(a&(1<<k)))k++;
            a+=(1<<k);
        }
    }

    int query(int a)
    {
        int s = 0,k = 0;
        while(a > 0)
        {
            s+=AIB[a];
            while(!(a&(1<<k)))k++;
            a-=(1<<k);
        }
        return s;
    }

    int bin(int a)
    {
        int ls = 1 , ld = N , m , t;
        while(ls <= ld)
        {
            m = (ls+ld)/2;
            t = query(m);
            if(a == t)return m;
            else
                if(a < t)
                    ld = m-1;
                else
                    ls = m+1;
        }
        return -1;
    }