Cod sursa(job #2525012)

Utilizator Briana_NeaguNeagu Briana Briana_Neagu Data 16 ianuarie 2020 18:22:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <bits/stdc++.h>
#define zeros(x) ((x ^ (x - 1)) & x)

using namespace std;

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

const int nmax = 1e5 + 5;

class BinaryIndexedTree
{
private:
    int tree[nmax];
    int n;
    int powMax;

    int findPow()
    {
        int pow = 1;
        while (pow < n)
            pow <<= 1;
        return pow;
    }

public:
    BinaryIndexedTree(int n)
    {
        this -> n = n;
        this -> powMax = findPow();
    }
    void update(int id, int val)
    {
       for (int node = id; node <= n; node += zeros(node))
           tree[node] += val;
    }

    int prefixSum(int id)
    {
        int sum = 0;
        for (int node = id; node > 0; node -= zeros(node))
            sum += tree[node];
        return sum;
    }

    int query(int val)
    {
        int pow = powMax;
        int i = 0;
        while (pow > 0)
        {
            if (i + pow <= n)
                if (tree[i + pow] <= val)
                {
                    val -= tree[i + pow];
                    i += pow;
                    if (val == 0)
                        return i;
                }
            pow >>= 1;
        }
        return  -1;
    }
};

int main()
{
   int n, m;
   f >> n >> m;
   auto Tree = new BinaryIndexedTree(n);
   for (int i = 1; i <= n; ++ i)
   {
       int x;
       f >> x;
       Tree -> update(i, x);
   }
   while (m --)
   {
       int op, a, b;
       f >> op;
       if (op == 0)
       {
           f >> a >> b;
           Tree -> update(a, b);
       }
       else if (op == 1)
       {
           f >> a >> b;
           g << Tree -> prefixSum(b) - Tree -> prefixSum(a - 1) << '\n';
       }
       else
       {
           assert(op == 2);
           f >> a;
           g << Tree -> query(a) << '\n';
       }
   }
}