Cod sursa(job #1917955)

Utilizator raulrusu99Raul Rusu raulrusu99 Data 9 martie 2017 13:42:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
#define N_MAX 100005

int aib[N_MAX];
int n, m;

void update(int poz, int val)
{
    for( ; poz<=n; poz+=poz & (-poz))
        aib[poz] += val;
}

int sum(int poz)
{
    int s = 0;
    for( ; poz > 0; poz -= poz & (-poz))
        s += aib[poz];
    return s;
}

int query(int st, int dr)
{
    return (sum(dr) - sum(st - 1));
}

int bin_search(int val)
{
    int step, pos = 0;
    for(step = 1; step <= n; step <<= 1);
    for(; step > 0; step >>= 1)
        if(pos + step <= n)
            if(aib[pos + step] <= val)
            {
                val -= aib[pos + step];
                pos += step;
            }
    return pos;
}

int main()
{
    f >> n >> m;
    int x;
    for(int i = 1; i <= n; i++)
    {
        f >> x;
        update(i, x);
    }
    int p, pos, val, st, dr;
    for(int i = 1; i <= m; i++)
    {
        f >> p;
        if(p == 0)
        {
            f >> pos >> val;
            update(pos, val);
        }
        if(p == 1)
        {
            f >> st >> dr;
            g << query(st, dr) << '\n';
        }
        if(p == 2)
        {
            f >> val;
            pos = bin_search(val - 1);
            if(sum(pos + 1) == val) g << pos + 1;
            else g << -1;
            g << '\n';
        }
    }
    return 0;
}