Cod sursa(job #2211789)

Utilizator zvonTutuldunsa Voronokda zvon Data 11 iunie 2018 21:04:31
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<iostream>
#include<fstream>
#include "math.h"
using namespace std;
ifstream fi("aib.in");
ofstream fo("aib.out");
int n, m;
int A[100001];

void add(int pos, int num) {
	while(pos <= n) {
		A[pos] += num;
		pos += pos & -pos;	
	}
}

int sum(int pos) {
	int s = 0;
	while (pos > 0) {
		s += A[pos];
		pos -= pos & -pos;
	}
	return s;
}

int mink(int num) {
	int step;
	step = 1 << (int) log2(n);
	for (int i = 0; step != 0; step >>= 1) {
		if (i + step <= n) {
			if (num >= A[i + step]) {
				i += step;
				num -= A[i];
				if (num == 0)
					return i;
			}
		}
	}
	return -1;
}

void prv() {
	for (int i = 1; i <= n; i++) {
        cout << A[i] << ' ';
    }
	cout << '\n';	
}

int main() {
    fi >> n >> m;
    int op, a, b;
    int x, y;
    for (int i = 1; i <= n; i++) {
        fi >> a;
        add(i, a); 
    }
    for (int i = 1; i <= m; i++) {
        fi >> op;
        switch (op) {
            case 0:
                fi >> a >> b;
                add(a, b);
                break;
            case 1:
                fi >> a >> b;
                fo << sum(b) - sum(a - 1) << "\n";
				break;
            case 2:
                fi >> a;
                fo << mink(a) << '\n';
                break;
        } 
    }
    fi.close();
    fo.close();
    return 0;  
}