Cod sursa(job #2812732)

Utilizator dana24hdDana N dana24hd Data 4 decembrie 2021 22:53:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <bits/stdc++.h>

using namespace std;

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

/**
AIB = arbore indexat binar - BIT (binary indexed tree) - Fenwick Tree

1. update pe un sufix cu o functie f
2. query pe un element
**/
/// LSB = least significant bit = cel mai mic bit activ
/// lsb(8) = 8
/// lsb(25) = 1
/// lsb(-1) = 1 ; reprezentarea nr negative: bit de semn+restul bitilor
/// -1 in baza 2 : 1111...1
auto GetNegation = [](int x){
    /// inversam bitii si adaugam 1
    return (~x)+1;
};


#define lsb(X) ((X) & -(X))

const int NMAX=100002;

int aib[NMAX];

void Update( int poz, int val ){
    while( poz<NMAX ){
        aib[poz] += val;
        poz += lsb(poz);
    }
}

long long Query( int poz ){
    long long suma=0;
    while(poz){
        suma+=aib[poz];
        poz-=lsb(poz);
    }
    return suma;
}

/*
void UpdateOnSegment( int st, int dr, int val ){

    Update( st, val );
    Update( dr+1, -val );

} */

/** aib pe 2D**/

int main()
{
    int n, m;
    in>>n>>m;

    int val;
    for(int i=1; i<=n; i++){
        in>>val;
        Update( i, val );
    }

    int op, x, y;
    for(int i=1; i<=m; i++){
        in>>op;
        if( op==0 ){
            in>>x>>y;
            Update( x, y );
            //out<<"update "<<aib[x]<<'\n';
        }
        if( op==1 ){
            in>>x>>y;
            long long rez = Query( y ) - Query( x-1 );
            out<<rez<<'\n';
        }
        if( op==2 ){
            in>>x;
            //out<<"caut bin ";


            int p=1, poz;
            while(p<=n)
                p=p*2;

            for(poz=0; p>0; p=p/2){
                if(poz+p<=n && Query(poz+p)<x)
                    poz=poz+p;
            }

            if( Query(poz+1)==x )
                out<<poz+1<<'\n';
            else
                out<<-1<<'\n';




        }
    }



    return 0;
}