Cod sursa(job #797299)

Utilizator fhandreiAndrei Hareza fhandrei Data 13 octombrie 2012 19:25:40
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
// Include
#include <fstream>
#include <algorithm>
using namespace std;

// Constante
const int sz = 15001;

// Functii
void update(int position, int value);
int query(int position);

// Variabile
ifstream in("datorii.in");
ofstream out("datorii.out");

int n, questions;
int tree[sz];

// Main
int main()
{
	in >> n >> questions;
	
	int value;
	for(int i=1 ; i<=n ; ++i)
	{
		in >> value;
		update(i, value);
	}
	
	int type, start, dif;
	while(questions--)
	{
		in >> type >> start >> dif;
		if(type)
			out << query(min(start+dif, n)) - query(start-1) << '\n';
		else
			update(start, -dif);
	}
	
	in.close();
	out.close();
	return 0;
}

void update(int position, int value)
{
	int power = 0;
	while(position <= n)
	{
		tree[position] += value;
		while(!(1<<power&position))
			++power;
		position += 1<<power++;
	}
}

int query(int position)
{
	int sum = 0;
	int power = 0;
	while(position)
	{
		sum += tree[position];
		while(!(1<<power & position))
			++power;
		position -= 1<<power++;
	}
	
	return sum;
}