Cod sursa(job #2870081)

Utilizator toma_ariciuAriciu Toma toma_ariciu Data 12 martie 2022 07:44:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <iostream>
#include <fstream>

using namespace std;

const string filename = "aib";
ifstream fin(filename + ".in");
ofstream fout(filename + ".out");

int n, q, pow2, aib[100005];

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

int query(int poz)
{
    int aux = 0;
    for(int i = poz; i >= 1; i -= (i & (-i)))
        aux += aib[i];
    return aux;
}

int cautbin(int k)
{
    int aux = 0, sum = 0;
    for(int i = pow2; i > 0; i >>= 1)
    {
        if(aux + i <= n && sum + aib[aux + i] <= k)
        {
            aux += i;
            sum += aib[aux];
        }
    }
    if(sum == k && aux != 0)
        return aux;
    else
        return -1;
}

int main()
{
    fin >> n >> q;
    for(int i = 1; i <= n; i++)
    {
        int a;
        fin >> a;
        update(i, a);
    }
    pow2 = 1;
    while(pow2 * 2 <= n)
        pow2 *= 2;
    for(int i = 1; i <= q; i++)
    {
        int cer, a, b;
        fin >> cer;
        if(cer == 0)
        {
            fin >> a >> b;
            update(a, b);
        }
        if(cer == 1)
        {
            fin >> a >> b;
            fout << query(b) - query(a - 1) << '\n';
        }
        if(cer == 2)
        {
            fin >> a;
            fout << cautbin(a) << '\n';
        }
    }
    return 0;
}