Cod sursa(job #480902)

Utilizator dcm9000Dinu Cristian Mircea - UPB dcm9000 Data 30 august 2010 00:57:50
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#include <string>

using namespace std;

#define FILE_IN "datorii.in"
#define FILE_OUT "datorii.out"

int N, M;
int A[13][16384];

void achitare(int zi, int suma)
{
	for (int i=0; i<=12; i++)
	{
		A[i][zi >> i] -= suma;
	}
}

int interog(int p, int q, int niv, int offs)
{
	int l = offs*(1 << niv);
	int r = l+(1 << niv)-1;

	if ((q<l) || (p>r)) return 0;
	if ((p<=l) && (q>=r)) return A[niv][offs];

	return interog(p, q, niv-1, 2*offs)+interog(p, q, niv-1, 2*offs+1);
}

int interogare(int p, int q)
{
	return interog(p, q, 12, 0);
}

void genarb()
{
	for (int i=1; i<=12; i++)
		for (int j=0; j<(16384 >> i); j++)
			A[i][j] = A[i-1][j << 1]+A[i-1][(j << 1) +1];
}

int main()
{
	ifstream fisIn(FILE_IN);
    ofstream fisOut(FILE_OUT);

    fisIn >> N >> M;
	for (int i=0; i<N; i++) fisIn >> A[0][i];
	for (int i=N; i<16384; i++) A[0][i] = 0;

	genarb();

	for (int i=0; i<M; i++)
	{
		int codOp, arg1, arg2;
		
		fisIn >> codOp >> arg1 >> arg2;

		if (codOp == 0) achitare(arg1-1, arg2);
		if (codOp == 1) fisOut << interogare(arg1-1, arg2-1) << "\n";
	}
}