Cod sursa(job #3161146)

Utilizator gianiferSpita Alexandru-Mihai gianifer Data 25 octombrie 2023 21:25:31
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("aib.in");

ofstream fout("aib.out");

int n, m;

int a[100005];

int v[100005];

int query(int poz)
{
    int suma = 0;
    for (int i = poz; i > 0; i -= (i & -i))
        suma += a[i];
    return suma;
}
void update(int a1, int b)
{
    for (int i = a1; i <= n; i += (i & -i))
    {
        a[i] += b;
    }
}
int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++)
        fin >> v[i];
    for (int i = 1; i <= n; i++)
    {
        update(i, v[i]);
    }
    for (int i = 1; i <= m; i++)
    {
        int op, x, y;
        fin >> op;
        if (op == 0)
        {
            fin >> x >> y;
            update(x, y);
        }
        else if (op == 1)
        {
            fin >> x >> y;
            fout << query(y) - query(x - 1) << '\n';
        }
        else
        {
            int k;
            fin >> k;
            x = 1, y = n;
            bool da=false;
            while (x <= y && !da)
            {
                int mij = (x + y) / 2;
                int suma = query(mij);
                if (k == suma)
                {
                    fout << mij<<'\n';
                    da=true;
                }
                else if (k > suma)
                    x = mij + 1;
                else
                    y = mij - 1;
            }
            if(!da)
            fout<<-1<<'\n';
        }
    }
}