Cod sursa(job #2698370)

Utilizator valeriucaraselCarasel Valeriu valeriucarasel Data 21 ianuarie 2021 20:22:01
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("aib.in");
ofstream out("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;
}

int query(int poz)
{
    int sum = 0;
    for(int i=poz; i>0; i -= (i&(-i)))
        sum += aib[i];
    return 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;
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        in>>a;
        for(int j=i; j<=n; j += (j&(-j)))
            aib[j] += a;
    }

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

    }

    return 0;
}