Cod sursa(job #2696637)

Utilizator FredyLup Lucia Fredy Data 16 ianuarie 2021 11:23:42
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define limn 100010
int aib[limn];
int n, m;

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

/// returneaza suma de la 1 la poz
int query(int poz)
{
    int sum = 0;
    for(int i=poz; i>0; i -= (i&(-i)))
        sum += aib[i];
    return sum;
}

///poz minima poz astfel incat suma de la 1 la poz este sum
int pozMin(int sum)
{
    int mask, pos;
    for(mask = 1; mask<=n; mask<<=1);
    mask>>=1;
    pos = 0;
    for(; mask; mask>>=1)
        if(pos + mask <= n)
            if(aib[pos+mask] <= sum)
            {
                pos += mask;
                sum -= aib[pos];
                if(sum == 0)
                    return pos;
            }
    return -1;
}

int main()
{
    int op, a, b;
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fin>>a;
        for(int j=i; j<=n; j += (j&(-j)))
            aib[j] += a;
    }

    while(m--)
    {
        fin>>op;
        if(op == 0) //valorii elem de pe poz a se adauga valoarea b
        {
            fin>>a>>b;
            add(a, b);
        }
        else if(op == 1) //sa se det suma (a , b)
        {
            fin>>a>>b;
            fout<<query(b) - query(a-1)<<'\n';
        }
        else if(op == 2) //poz minima k astfel incat suma de la 1 la k ii a
        {
            fin>>a;
            fout<<pozMin(a)<<'\n';
        }

    }

    return 0;
}