Cod sursa(job #2431399)

Utilizator ezioconnorVlad - Gabriel Iftimescu ezioconnor Data 19 iunie 2019 11:59:03
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 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 = 256;

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;
    }
    int buck_st = x / sq, buck_dr = y / sq;
    for (int i = x; i / sq == buck_st; ++i)
        s += v[i];
    for (int i = y; i / sq == buck_dr; --i)
        s += v[i];
    for (int i = buck_st + 1; i <= buck_dr - 1; ++i)
        s += buck[i];
    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 - 1, 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;
}