Cod sursa(job #2716181)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 4 martie 2021 19:54:39
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <fstream>
#include <cmath>
#include <vector>

using namespace std;

ifstream cin ("aib.in") ;
ofstream cout("aib.out") ;

/// suma pt a-b va fi suma 1->b - suma 1->a-1

long long v[100009], arbore[100009], biti_la_sf[100009] ;

long long S(int k)
{

    long long sum = 0 ;

    while(k)
    {

        sum += arbore[k] ;

        k -= biti_la_sf[k] ;

    }

    return sum ;

}

long long suma(int st, int dr)
{

    return S(dr) - S(st - 1) ;

}

long long sp[100009] ;

int main()
{
    int n, q ;

    cin >> n >> q ;

    for(int f = 1 ; f <= n ; f ++)
        biti_la_sf[f] = (f & (f * -1)) ; /// este o putere a lui 2 direct

    for(int f = 1 ; f <= n ; f ++)
    {

        cin >> v[f] ;

        sp[f] = sp[f - 1] + v[f] ;

        int indice = f ;

        while(indice <= n)
        {

            arbore[indice] += v[f] ;

            indice += biti_la_sf[indice] ; /// acel biti_la_sf este direct puterea lui 2

        }

    }

    vector<int> spp ;

    for(int f = 1 ; f <= n ; f ++)
        spp.push_back(sp[f]) ;

    while(q --)
    {

        int a, b, c ;

        cin >> a ;

        if(a == 0)
        {
            cin >> b >> c ; /// la elem de pe poz b se adauga c

            int indice = b ;

            while(indice <= n)
            {

                arbore[indice] += c ;

                indice += biti_la_sf[indice] ;

            }

        }
        if(a == 1)
        {

            int st, dr ;

            cin >> st >> dr ;

            cout << "" << suma(st, dr) << "\n" ;

        }
        if(a == 2)
        {
            long long s ;

            cin >> s ;

            if(spp[(lower_bound(spp.begin(), spp.end(), s) - spp.begin())] != s)cout << -1 << '\n' ;
                else cout << "" << 1 + (lower_bound(spp.begin(), spp.end(), s) - spp.begin()) << '\n' ;

        }

    }

    return 0;
}