Cod sursa(job #2171546)

Utilizator raulrusu99Raul Rusu raulrusu99 Data 15 martie 2018 12:42:36
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define N_MAX 100005
int aib[N_MAX], n, m, p;
void update(int poz, int val)
{
    for(int i = poz; i <= n; i+=i&(-i))
        aib[i] += val;
}
long long query(int poz)
{
    long long s = 0;
    for(int i = poz; i ; i-=i&(-i))
        s += aib[i];
    return s;
}

long long sum(int a, int b)
{
    return query(b) - query(a - 1);
}

int caut_bin(int val)
{
    int step = 1, poz = 0;
    for(;step <= n; step <<= 1);
    for(; step; step >>= 1)
        if(step + poz <= n)
            if(aib[step + poz] <= val)
            {
                poz += step;
                val -= aib[poz];
            }
    return poz;
}
int main()
{
    int x;
    f >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        f >> x;
        update(i, x);
    }
    int a, b;
    while(m--)
    {
        f >> p;
        if(p == 0)
        {
            f >> a >> b;
            update(a, b);
        }
        if(p == 1)
        {
            f >> a >> b;
            g << sum(a, b) << "\n";
        }
        if(p == 2)
        {
            f >> a;
            int poz = caut_bin(a - 1);
            if(query(poz + 1) == a) g << poz + 1 << "\n";
            else g << - 1 << "\n";
        }
    }
    return 0;
}