Cod sursa(job #1220473)

Utilizator ariel_roAriel Chelsau ariel_ro Data 17 august 2014 14:35:43
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NX 65536

int N, M, A[NX], K;

void create(int l, int r, int originalPos, int currentPos, int val)
{
	if (l == r) 
	{
		if (K == 1) {
			A[currentPos] = val;
		} else {
			A[currentPos] -= val;
		}
	}
	else 
	{
		int mij = (l + r) / 2;
		if (originalPos <= mij) 
		{
			create(l, mij, originalPos, 2 * currentPos, val);
		}
		else
		{
			create(mij + 1, r, originalPos, 2 * currentPos + 1, val);
		}

		A[currentPos] = A[2 * currentPos] + A[2 * currentPos + 1];
	}
}

int query(int left, int right, int leftInt, int rightInt, int currentPos) 
{
	if (left == right)
	{
		return A[currentPos];
	}
	else
	{
		int mij = (left + right) / 2, leftRes = 0, rightRes = 0;
		if (leftInt <= mij) {
			leftRes = query(left, mij, leftInt, rightInt, 2 * currentPos);
		}
		
		if (rightInt > mij) {
			rightRes = query(mij + 1, right, leftInt, rightInt, 2 * currentPos + 1);
		}

		return leftRes + rightRes;
	}
}

int main() 
{
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	scanf("%d %d", &N, &M);
	
	K = 1;

	int elem = 0;
	for (int i = 1; i <= N; i++)
	{
		scanf("%d", &elem);

		create(1, N, i, 1, elem);
	}

	K = 0;

	int cod = 0, a = 0, b = 0;
	for (int i = 1; i <= M; i++)
	{
		scanf("%d %d %d", &cod, &a, &b);

		switch (cod)
		{
		case 0:
			create(1, N, a, 1, b);
			break;
		case 1:
			printf("%d ", query(1, N, a, b, 1));	
			break;
		}
	}
}