Cod sursa(job #2449341)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 19 august 2019 13:07:22
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, x, sum[100005];

void Update(int i, int v)
{
    for (; i <= n; i += i ^ (i & (i - 1)))
    {
        sum[i] += v;
    }
}

int Query(int i)
{
    int rez = 0;
    for (; i > 0; i -= i ^ (i & (i - 1)))
    {
        rez += sum[i];
    }
    return rez;
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        fin >> x;
        Update(i, x);
    }
    while (m--)
    {
        int p, a, b;
        fin >> p;
        if (p == 0)
        {
            fin >> a >> b;
            Update(a, b);
        }
        else if (p == 1)
        {
            fin >> a >> b;
            fout << Query(b) - Query(a - 1) << "\n";
        }
        else
        {
            fin >> a;
            int st = 1, dr = n, sol = -1;
            while (st <= dr)
            {
                int mid = (st + dr) / 2;
                if (Query(mid) <= a)
                {
                    sol = mid;
                    st = mid + 1;
                }
                else
                {
                    dr = mid - 1;
                }
            }
            if (sol == -1)
            {
                fout << -1 << "\n";
            }
            else
            {
                if (Query(sol) == a)
                {
                    fout << sol << "\n";
                }
                else
                {
                    fout << -1 << "\n";
                }
            }
        }
    }
    return 0;
}