Cod sursa(job #2356328)

Utilizator crion1999Anitei cristi crion1999 Data 26 februarie 2019 16:57:41
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 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 Findd(int value)
{
    int answer = 0;
    for(int pas = N; pas; pas >>= 1)
        if(pas + answer <= N && Query(pas + answer) <= value)
            answer += pas;

    if(Query(answer) == value)
        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 << Findd(a) << "\n";
        }
    }
}