Cod sursa(job #2716874)

Utilizator rARES_4Popa Rares rARES_4 Data 5 martie 2021 20:32:33
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb

#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("aib.in");
ofstream g ("aib.out");
int n,c,x,q;
int s[100001];
int aflare_nr_de_adunat(int nr)
{
    return nr & (-nr);
}
void add(int nr,int indice)
{
    if(indice>n)
        return;
    s[indice] += nr;
    int nr_de_adunat = aflare_nr_de_adunat(indice);
    add(nr,indice+ nr_de_adunat);
}
int suma(int poz)
{
    int sum = 0;
    while(poz>=1)
    {
        sum +=s[poz];
        poz-=aflare_nr_de_adunat(poz);
    }
    return sum;
}
int cb(int sum)
{
    int st = 1,dr = n,mij,rasp = -1;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        int suma_calc = suma(mij);
        if(suma_calc == sum)
        {
            rasp = mij;
            dr = mij - 1;
        }
        else if(suma_calc>sum)
        {
           dr = mij - 1;
        }
        else
        {
            st = mij +1;
        }
    }
    return rasp;
}
int main()
{
    f >> n>>q;
    for(int i = 1; i<=n; i++)
    {
        f >> x;
        add(x,i);
    }
    for(int i = 1; i<=q; i++)
    {
        f >> c;
        if(c == 0)
        {
            int a,b;
            f >> a >> b;
            add(b,a);
        }
        else if(c == 1)
        {
            int a,b;
            f >> a >> b;
            int suma_b = suma(b);
            int suma_a = suma(a-1);
            g << suma_b - suma_a<< '\n';
        }
        else if(c == 2)
        {
            int x;
            f >> x;
            g << cb(x)<< '\n';

        }
    }
}