Cod sursa(job #2098753)

Utilizator amaliarebAmalia Rebegea amaliareb Data 3 ianuarie 2018 14:43:45
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
const int MaxN = 100005;
int v[MaxN], aib[MaxN], n, m;

void upd(int k, int x)
{
    while (k <= n)
    {
        aib[k] += x;
        k += k & -k;
    }
}

int query(int k)
{
    int s = 0;
    while (k >= 1)
    {
        s += aib[k];
        k -= k & -k;
    }
    return s;
}

int cautbin(int a)
{
    int rez = 0, pas = 1 << 30;
    while (pas)
    {
        if (rez + pas <= n && query(rez + pas) <= a) rez += pas;
        pas /= 2;
    }
    if (rez == 0) return -1;
    if (query(rez) == a) return rez;
    return -1;
}

int main()
{
    f >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        f >> v[i];
        upd(i, v[i]);
    }
    for (int i = 1; i <= m; ++i)
    {
        int a, b, c;
        f >> c;
        if (c == 0)
        {
            f >> a >> b;
            upd(a, b);
            v[i] += b;
        }
        else if (c == 1)
        {
            f >> a >> b;
            g << query(b) - query(a - 1) << '\n';
        }
        else
        {
            f >> a;
            g << cautbin(a) << '\n';
        }
    }
    return 0;
}