Cod sursa(job #2431277)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 18 iunie 2019 19:29:00
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <cmath>

using namespace std;

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

int v[100001], n, m, x, y;
int buck[10000];
const int sq = 3;

inline int query1(int x, int y)
{
    int poz = x, s = 0;
    if (x / sq == y / sq)
    {
        for (int i = x; i <= y; ++i)
            s += v[i];
        return s;
    }
    while (x % sq != 0)
        s += v[x++];
    while (y % sq != sq - 1)
        s += v[y--];
    for (; x < y; x += sq)
        s += buck[x / sq];
    return s;
}

inline int cautbin(int x)
{
    int pos, s = 0;
    for (pos = 0; pos <= n / sq; ++pos)
    {
        s += buck[pos];
        if (s >= x)
            break;
    }
    int p = min((pos + 1) * sq, n);
    while (s != x && p)
        s -= v[p--];
    if (s != x)
        return -1;
    if (p > n)
        return n;
    return p;
}

int main()
{
    int tip, a, b;
    in >> n >> m;
    for (int i = 1; i <= n; ++i)
    {
        in >> v[i];
        buck[i / sq] += v[i];
    }
    for (int i = 1; i <= m; ++i)
    {
        in >> tip;
        if (tip != 2)
        {
            in >> a >> b;
            if (!tip)
            {
                v[a] += b;
                buck[a / sq] += b;
            }
            else
                out << query1(a, b) << '\n';
        }
        else
        {
            in >> a;
            out << cautbin(a) << '\n';
        }

    }
    return 0;
}