Cod sursa(job #1193117)

Utilizator RazvanR104Razvan-Andrei Ciocoiu RazvanR104 Data 30 mai 2014 23:20:38
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>

#include <algorithm>
#include <bitset>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#if __cplusplus > 199711L
#include <unordered_map>
#include <unordered_set>
#endif

#include <cstdio>
#include <ctime>
#include <cmath>
#include <cstring>
#include <cstdlib>

using namespace std;

typedef long long int64;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int NMAX = 100010;

int N, M;
int AIB[NMAX];

void add(int pos, const int &value)
{
    int nr_0 = 0;

    while(pos <= N)
    {
        AIB[pos] += value;
        while(!(pos & (1 << nr_0))) ++nr_0;
        pos += (1 << nr_0);
        ++nr_0;
    }
}

int sum(int pos)
{
    int nr_0 = 0, ret = 0;

    while(pos >= 1)
    {
        ret += AIB[pos];
        while(!(pos & (1 << nr_0))) ++nr_0;
        pos -= (1 << nr_0);
        ++nr_0;
    }

    return ret;
}

int min_k(int sum)
{
    int step, i;
    for (step = 1; step < N; step <<= 1);

    for (i = 0; step; step >>= 1)
    {
        if (i + step > N) continue;
        if (sum >= AIB[i + step])
        {
            i += step;
            sum -= AIB[i];
            if (sum == 0)
                return i;
        }
    }

    return -1;
}

int main()
{
    int i, value, op, a, b;

    fin >> N >> M;

    for (i = 1; i <= N; ++i)
    {
        fin >> value;
        add(i, value);
    }

    while(M--)
    {
        fin >> op >> a;
        if (op == 0) fin >> b, add(a, b);
        else if (op == 1) fin >> b, fout << sum(b) - sum(a - 1) << '\n';
        else fout << min_k(a) << '\n';
    }

	fin.close();
	fout.close();
	return 0;
}