Cod sursa(job #1419570)

Utilizator razvan3895Razvan-Mihai Chitu razvan3895 Data 15 aprilie 2015 22:54:35
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <string>
#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
	int i, *AIB, m, n, op, num, sum, dif, cp, search, max = 1, certain, step, j, sumA, sumB, val, a, b;
	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;
}