Cod sursa(job #2964858)

Utilizator Luka77Anastase Luca George Luka77 Data 14 ianuarie 2023 00:07:49
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <bits/stdc++.h>
#define FOR(WHATEVER) for(int i = 1; i <= WHATEVER; ++ i)
using namespace std;

/// INPUT / OUTPUT
const string problem = "aib";
ifstream fin(problem + ".in");
ofstream fout(problem + ".out");

/// GLOBAL VARIABLES
const int NMAX = 1e5+5, MOD = 1e9 + 7, INF = 1e9;
int n, q;
int aib[NMAX];

inline void update(int poz, int num)
{
    for(int i = poz; i <= n; i += (i&(-i)))
        aib[i] += num;
}

inline int query(int x)
{
    int sum = 0;
    for(int i = x; i >= 1; i -= (i&(-i)))
        sum += aib[i];
    return sum;
}

/// READING THE INPUT
int main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    fout.tie(NULL);

    fin >> n >> q;

    for(int i = 1; i <= n; ++ i)
    {
        int num;
        fin >> num;
        update(i, num);
    }

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