Cod sursa(job #2961944)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 7 ianuarie 2023 14:18:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include<fstream>
using namespace std;

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

const int NMAX = 1e5 + 1;

int aib[NMAX],n;

inline int lsb(int x)
{
    return (x & (-x));
}

void update(int p,int val)
{
    for(int i = p ; i <= n ; i += lsb(i))
        aib[i] += val;
}

int query(int a)
{
    int ans = 0;
    for(int i = a ; i > 0 ; i -= lsb(i))
        ans += aib[i];

    return ans;
}

void binar(int pref)
{
    int st = 1,dr = n,ans = -1;
    while(st <= dr)
        {
            int mid = st + (dr - st) / 2;
            int cate = query(mid);

            if(cate >= pref)
                ans = mid,dr = mid - 1;

            else st = mid + 1;
        }

    int rez = query(ans) == pref ? ans : -1;
    fout << rez << '\n';
}

int main()
{
    int t,a,b,q; fin >> n >> q;
    for(int i = 1; i <= n ; i++) fin >> aib[i];
    for(int i = 1; i <= n ; i++)
        {
            if(i + lsb(i) <= n)
                aib[i + lsb(i)] += aib[i];
        }

   while(q--)
    {
        fin >> t;
        if(t == 0)
            {
                fin >> a >> b;
                update(a,b);
            }

        else if(t == 1)
            {
                fin >> a >> b;
                fout << query(b) - query(a - 1) << '\n';
            }

        else
            {
                fin >> a;
                binar(a);
            }
    }

}