Cod sursa(job #2503758)

Utilizator victorv88Veltan Victor victorv88 Data 3 decembrie 2019 18:56:43
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, aib[100005], tip, a, b, x;

void add_aib(int ind, int val)
{
    while (ind<=n)
    {
        aib[ind]+=val;
        ind=ind+(ind&(-ind));
    }
}

int calc_sum(int st, int dr)
{
    int s2=0, s1=0;
    while (dr)
    {
        s2+=aib[dr];
        dr=dr-(dr&(-dr));
    }
    st--;
    while (st)
    {
        s1+=aib[st];
        st=st-(st&(-st));
    }
    return s2-s1;
}

void calc3(int k)
{
    int putere=1;
    while(putere<n)
        putere<<=1;
    for (int i=0; putere; putere>>=1)
    {
        if (i+putere<=n)
        {
            if (k>=aib[i+putere])
            {
                i+=putere;
                k-=aib[i];
                if (k==0)
                   {
                       g << i << '\n';
                       return;
                   }
            }
        }
    }
    g << -1 << '\n';
}

int main( )
{
    f >> n >> m;
    for (int i=1; i<=n; ++i)
    {
        f >> x;
        add_aib(i,x);
    }
    for (int i=1; i<=m; ++i)
    {
        f >> tip;
        if (tip==0)
        {
            f >> a >> b;
            add_aib(a,b);
        }
        else if (tip==1)
        {
            f >> a >> b;
            g << calc_sum(a,b) << '\n';
        }
        else
        {
            f >> a;
            calc3(a);
        }
    }
    return 0;
}