Cod sursa(job #1413732)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 2 aprilie 2015 02:10:49
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <string>
#include <stdio.h>
#include <iostream>
#include <ctime>
using namespace std;

int main() {
	int i, *AIB, min, m, n, op, num, sum, dif, cp, search, right = 1, max = 1, left, certain, step, j, val;
	cin >> m >> n;
	int t1, t2;
	t1 = time(0);
	bool *v = new bool[m];
	for(cp = m; cp >>= 1; max <<= 1);
	max <<= 1;
	AIB = new int[max + 1];

	for(int iteratii = 0; iteratii < m; iteratii++) {
		cin >> val;
		for (int i = iteratii + 1; i <= max; i += (i & (-i))) {
			        AIB[i] += val;
		}
	}
	

	for(int iteratii = 0; iteratii < n; iteratii++) {
		cin >> op;
		switch(op) {
			case 0:
				cin >> num >> val;
			    for (int i = num; i <= max; i += (i & (-i))) {
			        AIB[i] += val;
			    }
				break;

			case 1:
				cin >> left >> right;
				// cout << left << " " << right << endl;
				left--;
				right;
				sum = 0;
				while(left != right) {
					if(right > left) {
						sum += AIB[right];
						right -= (right & (-right));
					}
					else {
						sum -= AIB[left];
						left -= (left & (-left));
					}
				}
				cout << sum << endl;
				break;
				

			case 2:
				cin >> search;
				step = max >> 1, certain = 0;
				for(j = 0; step; step >>= 1) {
					if(AIB[j + step] <= search) {
						if(AIB[j + step] == search) {
							certain = j + step;
							continue;						
						}
						search -= AIB[j + step], j += step;
					}						
				}
				cout << certain << endl;
				break;
		}
		
	}
	delete[] AIB;
	delete[] v;
	return 0;
}