Cod sursa(job #651625)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 20 decembrie 2011 22:37:49
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <iostream>

#define MAXN 100002

using namespace std;

typedef unsigned int uint32;

uint32 tree[MAXN];

void Update(uint32 tree[], const uint32 n, uint32 pos, const uint32 val)
{
    while (pos <= n)
    {
        tree[pos] += val;
        pos += (pos & -pos);
    }
}

uint32 Query(const uint32 tree[], const uint32 n, uint32 pos)
{
    uint32 sum = 0;

    while (pos > 0)
    {
        sum += tree[pos];
        pos -= (pos & -pos);
    }
    
    return sum;
}

int Search(const uint32 tree[], const uint32 n, uint32 sum)
{
    uint32 step=1, i;
    
    while (step <= n)
        step <<= 1;
    
    for (i=0; step; step>>=1)
    {
        if (i+step<=n && sum>=tree[i+step])
        {
            i += step;
            sum -= tree[i];

            if (0 == sum)
            {
                return i;
            }
        }
    }
    
    return -1;
}

int main()
{
    int n, m;
    fstream fin("aib.in", fstream::in);
    fstream fout("aib.out", fstream::out);
    
    fin >> n >> m;
    //cout << n << endl;
    
    for (uint32 i=1; i<=n; ++i)
    {
        uint32 val;
        fin >> val;
        //cout << val << " ";
        
        Update(tree, n, i, val);
    }
    //cout << endl;
    
    for (uint32 i=0; i<m; ++i)
    {
        uint32 opt;
        fin >> opt;
        
        switch (opt)
        {
            case 0:
            {
                uint32 a,b;
                fin>> a >> b;
                
                Update(tree, n, a, b);
            }; break;
            
            case 1:
            {
                uint32 a,b;
                fin>> a >> b;
                
                fout << Query(tree, n, b) - Query(tree, n, a-1) << "\n";
            }; break;
            
            case 2:
            {
                uint32 a;
                fin >> a;
                fout << Search(tree, n, a) << "\n";
            }; break;
        }
    }

    fin.close();
    fout.close();
    return 0;
}