Cod sursa(job #2337360)

Utilizator victorv88Veltan Victor victorv88 Data 6 februarie 2019 12:16:54
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int arbore[100005], n, m, s, tip;

void update_arb(int val, int poz)
{
    while (poz<=n)
    {
        arbore[poz]+=val;
        poz=poz+(poz&(-poz));
    }
}

int get_sum(int ind)
{
    int sum=0;
    while (ind)
    {
        sum+=arbore[ind];
        ind=ind-(ind&(-ind));
    }
    return sum;
}

int Search(int val)

{

    int i, step;
    for ( step = 1; step < n; step <<= 1 );
    for( i = 0; step; step >>= 1 )
    {
        if( i + step <= n)
        {
            if( val >= arbore[i+step] )
            {
                i += step, val -= arbore[i];
                if ( !val ) return i;
            }
        }
    }
    return -1;

}

int main() {
    int x;
    f >> n >> m;
    for (int i=1; i<=n; i++)
    {
        f >> x;
        update_arb(x,i);
    }
    /*for (int i=1; i<=n; i++)
    {
        cout << arbore[i] <<' ';
    }*/
    for (int quer=0; quer<m; ++quer)
    {
        f >> tip;
        if (tip==0)
        {
            int a,b;
            f >> a >> b;
            update_arb(b,a);
        }
        else if (tip==1)
        {
            int a, b;
            f >> a >> b;
            g << get_sum(b)-get_sum(a-1) << '\n';
        }
        else
        {
            f >> x;
            g << Search(x) << '\n';
        }
    }
    return 0;
}