Cod sursa(job #1235200)

Utilizator PatrikStepan Patrik Patrik Data 28 septembrie 2014 22:25:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
    #include<cstdio>
    using namespace std;
    #define MAX 100001
    int N , AIB[MAX] , Q;

    void update(int a , int b);
    int query(int a);
    int search (int s);

    int main()
    {
        int t , a, b ;
        freopen("aib.in" , "r" , stdin );
        freopen("aib.out" , "w" , stdout );
        scanf("%d%d" , &N , &Q );
        for(int i = 1 ; i <= N ; ++i )
            {
                scanf("%d" , &t);
                update(i,t);
            }
        for(int i = 1 ; i <= Q ; ++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" , search(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 k = 0 , s  = 0;
        while(a)
        {
            s += AIB[a];
            while(!(a&(1<<k)))k++;
            a-=(1<<k);
        }
        return s;
    }

    int search (int s)
    {
        int ls = 1 , ld = N , mijl ;
        while(ls <= ld )
        {
            mijl = (ls+ld)/2;
            int r = query(mijl);
            if(r == s)return mijl;
            else
                if(r < s)ls = mijl + 1;
                else ld = mijl-1;
        }
        return -1;
    }