Cod sursa(job #1419575)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 15 aprilie 2015 23:02:19
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
	int *AIB, m, n, op, num, cp, search, max = 1, certain, step, j, sumA, sumB, a, b;
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	scanf("%d%d", &m, &n);
	for(cp = m; cp >>= 1; max <<= 1);
	max <<= 1;
	AIB = new int[max + 1];
	for(int iteratii = 0; iteratii < m; ++iteratii) {
		scanf("%d", &num);
		for (int i = iteratii + 1; i <= max; i += (i & (-i))) {
			        AIB[i] += num;
		}
	}

	for(int iteratii = 0; iteratii < n; ++iteratii) {
		scanf("%d", &op);
		switch(op) {

			case 0:
				scanf("%d%d", &a, &b);
			    for (int i = a; i <= max; i += (i & (-i))) {
			        AIB[i] += b;
			    }
				break;

			case 1:
				scanf("%d%d", &a, &b);
				sumA = 0;
				sumB = 0;
				for(int i = a - 1; i > 0; i -= (i & (-i)))
					sumA += AIB[i];
				for(int i = b; i > 0; i -= (i & (-i)))
					sumB += AIB[i];
				printf("%d\n", sumB - sumA);
				break;

			case 2:
				scanf("%d", &a);
				search = a;
				step = max, certain = -1;
				for(j = 0; step; step >>= 1) {
					if(j + step < max && AIB[j + step] <= search) {
						if(AIB[j + step] == search) {
							certain = j + step;
							continue;						
						}
						search -= AIB[j + step], j += step;
					}						
				}
				printf("%d\n", certain);
				break;
		}
		
	}

	// for(int i = 1; i <= m; ++i)
	// 	printf("%d ", AIB[i]);
	// cout << '\n';
	delete[] AIB;
	return 0;
}