Cod sursa(job #1165610)

Utilizator andreiiiiPopa Andrei andreiiii Data 2 aprilie 2014 19:37:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>

using namespace std;

class AIB{
public:
    AIB(const int _n=0):
        n(_n),
        aib(vector<int>(n+1, 0)){}
    void update(int i, const int val)
    {
        for(;i<=n;i+=lbs(i)) aib[i]+=val;
    }
    int operator[](int i) const
    {
        int ret=0;
        for(;i>0;i-=lbs(i)) ret+=aib[i];
        return ret;
    }
    int search(int s)
    {
        int i, step;
        for(step=1;step<n;step<<=1);
        for(i=0;step;step>>=1)
        {
            if(i+step<=n&&aib[i+step]<=s)
            {
                i+=step;
                s-=aib[i];
            }
        }
        if(s||!i) return -1;
        return i;
    }
private:
    int n;
    vector<int> aib;
    static int lbs(int x) {return x&(-x);}
};

AIB a;

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    int n, q, i, x, y;
    scanf("%d%d", &n, &q);
    a=AIB(n);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &x);
        a.update(i, x);
    }
    while(q--)
    {
        scanf("%d", &i);
        if(i==0)
        {
            scanf("%d%d", &x, &y);
            a.update(x, y);
        }
        else if(i==1)
        {
            scanf("%d%d", &x, &y);
            printf("%d\n", a[y]-a[x-1]);
        }
        else
        {
            scanf("%d", &x);
            printf("%d\n", a.search(x));
        }
    }
}