Cod sursa(job #1787302)

Utilizator RobertSSamoilescu Robert RobertS Data 24 octombrie 2016 13:59:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>

using namespace std;

const int MAX_N = 15001, MAX_LEN = 300020;
int N, M;

int v[MAX_N]; //datoriile initiale
int tree[MAX_LEN]; //arbore de intervale

int sum; //variabila in care retin 


void build_tree(int start, int end, int node) {
	if (start == end) {
		tree[node] = v[start];
	} else {
		int midd = start + (end - start) / 2;
		build_tree(start, midd, 2 * node);
		build_tree(midd + 1, end, 2 * node + 1);

		tree[node] = tree[2 * node] + tree[2 * node + 1];
	}
}


void update_query(int start, int end, int node, int day, int value) {
	if (start == end) {
		tree[node] -= value;
	} else {
	
		int midd = start + (end - start) / 2;
		if (day <= midd) update_query(start, midd, 2 * node, day, value);
		else update_query(midd + 1, end, 2 * node + 1, day, value);

		
		tree[node] -= value;
	}
}

void sum_query(int start, int end, int node, int f_day, int l_day) {

	if (f_day <= start  && end <= l_day) {
		sum += tree[node];
	} else {
		
		int midd = start + (end - start) / 2;
		if (f_day <= midd) sum_query(start, midd, 2 * node, f_day, l_day);
		if (l_day > midd) sum_query(midd + 1, end, 2 * node + 1, f_day, l_day);
	
	}

}


int main() {

	ifstream fin("datorii.in");
	ofstream fout("datorii.out");

	fin >> N >> M;
	for (int i = 1; i <= N; i++) {
		fin >> v[i];
	}


	build_tree(1, N, 1);
	
	int type, x, y;
	for (int i = 1; i <= M; i++) {
		fin >> type >> x >> y;
		
		if (type == 0) {
			update_query(1, N, 1, x, y);		
		} else {
			sum = 0;
			sum_query(1, N, 1, x, y);
			fout << sum << '\n';
		}
		
	}	



	fin.close();
	fout.close();


	return 0;
}