Cod sursa(job #2253026)

Utilizator razviii237Uzum Razvan razviii237 Data 3 octombrie 2018 16:06:03
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <iostream>
#include <fstream>

using namespace std;
const int maxn = 1e5+5;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, i, x, y, z;

class aib
{
private:
    int v[maxn];
public:
    void update(int pos, int val)
    {
        v[pos] += val;
        if(pos <= n && (pos+(pos & (-pos)) <= n) ) {
            update(pos+(pos & (-pos)), val);
        }
    }
    int query(int a, int b)
    {
        if(a != 1) {
            return query(1, b) - query(1, a-1);
        }
        //log
        int log, i, left = 0, sum = 0;
        for(i = 0; (1 << i) < n; i ++) {}
        log = (1 << (i));
        if(log > n)
            log >>= 1;

        while(log > 0)
        {
            if(b == left + log) {
                return sum + v[b];
            }
            if(b > left + log) {
                sum += v[left + log];
                left += log;
            }
            log >>= 1;
        }
    }
    int bsq(int a)
    {
        //log
        int log, i, left = 0, sum = 0;
        for(i = 0; (1 << i) < n; i ++) {}
        log = (1 << (i));
        if(log > n)
            log >>= 1;

        while(log > 0)
        {
            if(!(left + log <= n)) {
                log >>= 1;
                continue;
            }
            if(a == sum + v[left + log]) {
                return left + log;
            }
            if(a > sum + v[left + log]) {
                sum += v[left + log];
                left += log;
            }
            log >>= 1;
        }
        return -1;
    }
}a;

int main()
{
    f >> n >> m;
    for(i = 1; i <= n; i ++)
    {
        f >> x;
        a.update(i, x);
    }
    while(m--)
    {
        f >> x;
        if(x == 0 || x == 1)
        {
            f >> y >> z;
            if(x == 0) {
                a.update(y, z);
            }
            else {
                g << a.query(y, z) << '\n';
            }
        } else {
            f >> y;
                g << a.bsq(y) << '\n';
        }
    }

    f.close();
    g.close();
    return 0;
}