Cod sursa(job #2356379)

Utilizator crion1999Anitei cristi crion1999 Data 26 februarie 2019 17:30:11
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int N;
int M;

int aib[NMAX];

int val, a, b, type;

void Update(int pos, int value)
{
    for(int i = pos; i <= N; i += ((i) & (-i)))
        aib[i] += value;
}

int Query(int pos)
{
    int sum = 0;
    for(int i = pos; i ; i -= ((i) & (-i)))
        sum += aib[i];

    return sum;
}

int Search(int value)
{
    int step;
    for(step = 1; step < N; step <<= 1);

    int answer = 0;
    for(; step; step >>= 1)
    {
        if(answer + step <= N)
        {
            if(value >= aib[answer + step])
            {
                value -= aib[answer + step];
                answer += step;
                if(value == 0)
                    return answer;
            }
        }
    }
    return -1;
}


int main()
{
    fi >> N >> M;

    for(int i = 1; i <= N; ++i)
    {
        fi >> val;
        Update(i, val);
    }

    for(int i = 1; i <= M; ++i)
    {
        fi >> type;

        if(type == 0)
        {
            fi >> a >> b;
            Update(a, b);
        }
        else if(type == 1)
        {
            fi >> a >> b;
            fo << Query(b) - Query(a - 1) << "\n";
        }
        else if(type == 2)
        {
            fi >> a;
            fo << Search(a) << "\n";
        }
    }
}