Cod sursa(job #2658189)

Utilizator Rares31100Popa Rares Rares31100 Data 13 octombrie 2020 13:35:15
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("aib.in");
ofstream out("aib.out");
int n, m;
int treeB[100001];

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

int sum(int poz)
{
    int rez = 0;

    while(poz)
    {
        rez += treeB[poz];
        poz -= poz&-poz;
    }

    return rez;
}

int main()
{
    in >> n >> m;

    for(int i = 1, val; i <= n; i++)
    {
        in >> val;
        update(i, val);
    }

    for(int c, a, b; m; m--)
    {
        in >> c;
        switch(c)
        {
            case 0:
                in >> a >> b;
                update(a, b);
                break;

            case 1:
                in >> a >> b;
                out << sum(b) - sum(a-1) << '\n';
                break;

            case 2:
                in >> a;
                int poz = 0;

                for(int p = n; p; p/=2)
                    while(poz + p < n && sum(poz+p) < a)
                        poz += p;

                out << poz+1 << '\n';
                break;
        }
    }

    return 0;
}