Cod sursa(job #2135847)

Utilizator Mihai_PredaPreda Mihai Dragos Mihai_Preda Data 19 februarie 2018 12:43:09
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

class AIB
{
public:
    AIB(int sz)
    {
        v.resize(sz + 1);
        n = sz;
    }
    void Add(int ind, int val)
    {
        while(ind <= n)
        {
            v[ind] += val;
            ind += ind & (-ind);
        }
    }
    int Query(int dr)
    {
        int ret = 0;
        while(dr >= 1)
        {
            ret += v[dr];
            dr -= dr & (-dr);
        }
        return ret;
    }
    int Query(int st, int dr)
    {
        return Query(dr) - Query(st - 1);
    }
    int GetFirstPos(int sum)
    {
        int ret = -1;
        int step;
        for(step = 1; step < n; step <<= 1);
        for(int i = 0; step > 0; step >>= 1)
        {
            if(i + step <= n)
            {
                if(sum > v[i + step])
                {
                    i += step;
                    sum -= v[i];
                }
                else if(sum == v[i + step])
                    ret = i + step;
            }
        }
        return ret;
    }
private:
    vector<int> v;
    int n;
};

const int nMax = 100005;

int n, m;

int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
    in >> n >> m;
    AIB aib(n);
    int x;
    for(int i = 1; i <= n; ++i)
    {
        in >> x;
        aib.Add(i, x);
    }
    int t, a, b;
    for(int i = 1; i <= m; ++i)
    {
        in >> t;
        if(t == 0)
        {
            in >> a >> b;
            aib.Add(a, b);
        }
        if(t == 1)
        {
            in >> a >> b;
            out << aib.Query(a, b) << "\n";
        }
        if(t == 2)
        {
            in >> a;
            out << aib.GetFirstPos(a) << "\n";
        }
    }
    return 0;
}