Cod sursa(job #1689406)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 14 aprilie 2016 10:56:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <cstdio>
#define MAXN 100050

using namespace std;

int n, m;

struct arbore
{
	int *mem, sz;
    arbore(int sz = 0)
    {
        mem = new int[sz+1];
		this->sz = sz;
    }
    inline int zero(int x)
    {
    	return (x^(x-1))&x;
    }

    void update(int ind, int val)
    {
        for (int i = ind; i <= sz; i+=zero(i))
            mem[i] += val;
    }

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

	int sum(int dr)
	{
		int rez = 0;
        for (int i = dr; i > 0; i -= zero(i))
			rez += mem[i];
		return rez;
	}

	int lookup(int val)
	{
        int step, rez = 0, sum = 0;
        for (step = 1; step < sz; step <<= 1);
        for (rez = 0; step; step >>= 1) {
            if (rez + step <= sz && sum + mem[rez+step] <= val)
				rez += step, sum += mem[rez];
        }
        if (sum == val && rez >= 1 && rez <= sz)
			return rez;
		return -1;
	}

}aib;

void citire()
{
    scanf("%d %d\n", &n, &m);
    aib = arbore(n);
    int x;
    for (int i = 1; i <= n; i++) {
		scanf("%d", &x);
		aib.update(i, x);
    }
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    citire();
    for (int i = 1; i <= m; i++) {
        int tip, a, b;
        scanf("%d", &tip);
        if (tip == 0) {
			scanf("%d %d", &a, &b);
            aib.update(a, b);
        }
        else if (tip == 1) {
            scanf("%d %d", &a, &b);
            printf("%d\n", aib.sum(a, b));
        }
        else if (tip == 2) {
            scanf("%d", &a);
            printf("%d\n", aib.lookup(a));
        }
    }

    return 0;
}