Cod sursa(job #3030785)

Utilizator Luka77Anastase Luca George Luka77 Data 17 martie 2023 21:14:38
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5 + 5;

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

struct AIB
{
    inline int itr(int x)
    {
        return x & (-x);
    }
    int len = 0;
    vector<int>aib;
    AIB(int n)
    {
        aib.resize(n + 5, 0);
        len = n;
    }
    inline void update(int pos, int val)
    {
        for(int i = pos; i <= len; i += itr(i))
            aib[i] += val;
    }
    inline int query(int x)
    {
        int sum = 0;
        for(int i = x; i >= 1; i-=itr(i))
            sum += aib[i];
        return sum;
    }
};

int n, m;
AIB aib(NMAX);

int main()
{
    fin >> n >> m;

    for(int i = 1; i <= n; ++ i)
    {
        int a;
        fin >> a;
        aib.update(i, a);
    }
    
    while(m--)
    {
        int tip;
        fin >> tip;
        if(tip == 0)
        {
            int a, b;
            fin >> a >> b;
            aib.update(a, b);
        }
        if(tip == 1)
        {
            int a, b;
            fin >> a >> b;
            fout << aib.query(b) - aib.query(a - 1) << '\n';
        }
        if(tip == 2)
        {
            int a;
            fin >> a;
            int st = 1, dr = n, ans = 0;
            while(st <= dr)
            {
                int mid = (st + dr) / 2;
                if(aib.query(mid) >= a)
                {
                    dr = mid - 1;
                    if(aib.query(mid) == a)
                        ans = mid;
                }
                else
                    st = mid + 1;
            }
            if(ans)
                fout << ans << '\n';
            else
                fout << -1 << '\n';
        }
    }
}