Cod sursa(job #2716468)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 5 martie 2021 11:15:36
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 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 ;

            int st = 1, dr = n ;

            while(st <= dr)
            {

                int mid = (st + dr) / 2 ;

                if(s > S(mid))st = mid + 1 ;
                    else dr = mid - 1 ;

            }

            st = (st + dr) / 2 ;

            while(S(st) == s)st -- ;

            if(S(st + 1) != s)cout << -1 << '\n' ;
            else
            cout << st + 1 << '\n' ;

        }

    }

    return 0;
}