Cod sursa(job #2253127)

Utilizator razviii237Uzum Razvan razviii237 Data 3 octombrie 2018 17:27:25
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>

using namespace std;
const int maxn = 15e3+3;

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

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

class aib
{
private:
    int v[maxn];
public:
    void add(int i, int x)
    {
        while(i <= n) {
            v[i] += x;
            i += (i & (-i));
        }
    }
    int query(int a, int b)
    {
        if(a != 1) {
            return query(1, b) - query(1, a-1);
        }

        int log = logn, sum = 0, left = 0;
        while(log > 0)
        {
            if(left + log > n) {
                log >>= 1; continue;
            }
            if(b == left + log) {
                return sum + v[left + log];
            }
            if(b > left + log) {
                sum += v[left + log];
                left += log;
            }
            log >>= 1;
        }
    }
}bt;

int main()
{
    f >> n >> m;
    for(i = 0; (1 << i) < n; ++i) {}
    logn = (1 << i);

    for(i = 1; i <= n; i ++)
    {
        f >> x;
        bt.add(i, x);
    }

    while(m--)
    {
        f >> x >> y >> z;
        if(x == 0) {
            bt.add(y, -z);
        } else {
            g << bt.query(y, z) << '\n';
        }
    }

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