Cod sursa(job #2484828)

Utilizator FrostfireMagirescu Tudor Frostfire Data 31 octombrie 2019 17:40:59
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <iostream>
#define NMAX 100000

using namespace std;

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

int n, q, maxBit, aib[NMAX+10];

void update(int poz, int val)
{
    while(poz <= n)
        {   aib[poz] += val;
            int lastBit = poz & (-poz);
            poz += lastBit;
        }
}

int query(int poz)
{
    int sol = 0;
    while(poz)
        {   sol += aib[poz];
            int lastBit = poz & (-poz);
            poz -= lastBit;
        }
    return sol;
}

int binSearch(int val)
{
    int bitMask = maxBit, poz = 0;
    while(bitMask > 0)
        {   int mij = poz + bitMask;
            bitMask = bitMask >> 1;
            if(mij <= n)
                {   if(aib[mij] <= val)
                        {   poz = mij;
                            val -= aib[mij];
                        }
                }
        }
    if(val) return -1;
    return poz;
}

int main()
{
    f >> n >> q;
    for(int i=0; i<=18; i++) if((1 << i) & n) maxBit = 1 << i;
    for(int i=1; i<=n; i++)
        {   int x;
            f >> x;
            update(i, x);
        }

    while(q--)
        {   int type;
            f >> type;
            if(!type)
                {   int a, b;
                    f >> a >> b;
                    update(a, b);
                }
            else if(type == 1)
                {   int a, b;
                    f >> a >> b;
                    g << query(b) - query(a-1) << '\n';
                }
            else
                {   int a;
                    f >> a;
                    if(!a) g << -1 << '\n';
                    else g << binSearch(a) << '\n';
                }
        }
    return 0;
}