Cod sursa(job #2753148)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 21 mai 2021 11:41:48
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>

#define int long long

using namespace std;

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

int n, val, m;
int aib[100100];
int v[100100];

void update(int poz, int val)
{
    while(poz <= n)
    {
        aib[poz] += val;
        poz += (poz & (-poz));
    }
}

int query(int poz)
{
    int ans = 0;
    while(poz != 0)
    {
        ans += aib[poz];
        poz = poz - (poz & (-poz));
    }
    return ans;
}

int pozmin(int val)
{
    if(!val)
    {
        return -1;
    }
    int dr = 0, pas = (1 << 16);
    while(pas != 0)
    {
        if(dr + pas <= n && aib[dr + pas] <= val)
        {
            val -= aib[dr + pas];
            dr += pas;
        }
        pas /= 2;
    }
    if(val)
    {
        return -1;
    }
    return dr;
}

int32_t main()
{
    fin >> n;
    fin >> m;
    for(int i = 1; i <= n; i ++)
    {
        fin >> v[i];
        update(i,v[i]);
    }
    for(int i = 1; i <= m; i ++)
    {
        int q;
        fin >> q;
        if(q == 0)
        {
            int poz, val;
            fin >> poz >> val;
            update(poz,val);
        }
        else
        {
            if(q == 1)
            {
                int st, dr;
                fin >> st >> dr;
                fout << query(dr) - query(st - 1) << '\n';
            }
            else
            {
                int sum;
                fin >> sum;
                fout << pozmin(sum) << '\n';
            }
        }
    }
}