Cod sursa(job #2356406)

Utilizator XDDDDariusPetean Darius XDDDDarius Data 26 februarie 2019 17:46:42
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
std::ifstream in("aib.in");
std::ofstream out("aib.out");

using namespace std;
int sir[NMAX] , aib[NMAX];
int N,intrebari;
void adaugare(int poz , int val)
{
    for(int i = poz ; i<=N ; i += (i)&(-i))
    {
        aib[i] += val;
    }
}
int sum(int poz)
{
    int sol = 0;
    for(int i = poz ; i>0 ; i -= (i)&(-i))
    {
        sol += aib[i];
    }
    return sol;
}
int caut_bin(int cautat)
{
    int poz = 0;
    for(long long i = (1<<30) ; i>0 ; i=i>>1)
    {
        if(poz + i <= N)
        {
            if(sum(poz+i) <= cautat)
            {
                poz += i ;
            }
        }
    }
    if(aib[poz] != cautat)
        return -1;
    return poz;
}
int tip , b;
int a;

int main()
{
    in>>N>>intrebari;
    for(int i=1; i<=N ; i++)
    {
        in>>sir[i];
    }
    for(int i = 1 ;i<=N ; i++)
    {
        for(int j = i ; j<=N ; j +=(j)&(-j))
        {
            aib[j] += sir[i];
        }
    }
    for(int i = 1 ; i<= intrebari ; i++)
    {
        in>>tip;
        if(tip != 2)
        {
            in>> a >> b;
            if(tip == 0 )
            {
                adaugare(a,b);
            }
            else
            {
                out<<sum(b) - sum(a-1)<<"\n";
            }
        }
        else
        {
            in >> a;
            out<<caut_bin(a)<<"\n";
        }
    }
    return 0;
}