Cod sursa(job #3311076)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 19 septembrie 2025 10:43:36
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <bits/stdc++.h>

std::ifstream fin("aib.in");
std::ofstream fout("aib.out");

const int NMAX = 1e5 + 5;

int n, q;
int fenwick[NMAX];

int LSB(int x) { return (x & (-x)); }

void update(int poz, int val)
{
    for(int i = poz; i <= n; i += LSB(i))
        fenwick[i] += val;
}

int query(int poz)
{
    int ans = 0;
    for(int i = poz; i >= 1; i -= LSB(i))
        ans += fenwick[i];
    return ans;
}

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    fin >> n >> q;

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

    for(int k = 1; k <= q; ++k)
    {
        int task;
        fin >> task;

        if(task == 0)
        {
            int a, b;
            fin >> a >> b;
            update(a, b);
        }
        else if(task == 1)
        {
            int a, b;
            fin >> a >> b;
            
            fout << query(b) - query(a - 1) << "\n";
        }
        else if(task == 2)
        {
            int target;
            fin >> target;

            int sum = 0;
            int poz = 0;
            
            // Binary search on bits of the answer starting from MSB to LSB
            // LSB(poz + 1 << bit) = bit => sum[1....(1 << bit)] = sum +  fenwick[poz + 1 << bit], O(1)
            for(int bit = 17; bit >= 0; --bit)
                if(poz + (1 << bit) <= n && sum + fenwick[poz + (1 << bit)] < target)
                {
                    sum += fenwick[poz + (1 << bit)];
                    poz += (1 << bit);
                }

            if(poz > n)
                fout << -1 << "\n";

            if(query(poz + 1) == target)
                fout << poz + 1 << "\n";
            else
                fout << -1 << "\n";
        }
    }

    return 0;
}