Cod sursa(job #3273783)

Utilizator AndreiNicolaescuEric Paturan AndreiNicolaescu Data 3 februarie 2025 20:34:54
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define cin ci
#define cout co
using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
const int Nmax = 100005;
int n, m, x, y, c;
vector<int> aib;
void update(int node, int val)
{
    for(; node <= n; node += node&(-node))
        aib[node] += val;
}
int query(int node)
{
    int ans = 0;
    for(; node > 0; node -= node&(-node))
        ans += aib[node];
    return ans;
}
int bs(int val)
{
    int ans = 0, csum = 0;
    for(int step = (1 << 22); step > 0; step /= 2)
        if(ans + step <= n && csum + aib[ans + step] < val)
        {
            ans += step;
            csum = aib[ans];
        }
    if(ans + 1 > n || query(ans + 1) != val)
        return -1;
    return ans + 1;
}
int main()
{
    cin >> n >> m;
    aib.resize(n+1);
    for(int i=1; i<=n; i++)
    {
        cin >> x;
        update(i, x);
    }
    while(m--)
    {
        cin >> c;
        if(c == 0)
        {
            cin >> x >> y;
            update(x, y);
        }
        else
            if(c == 1)
            {
                cin >> x >> y;
                cout << query(y) - query(x - 1) << '\n';
            }
            else
            {
                cin >> x;
                cout << bs(x) << '\n';
            }
    }
    return 0;
}