Cod sursa(job #587473)

Utilizator Catah15Catalin Haidau Catah15 Data 4 mai 2011 22:02:23
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <cmath>

using namespace std;

#define maxN 100005
#define maxRad 350


int A[maxN], sums[maxRad], rad;


void update (int X, int Y)
{
	int poz = 0;
	
	if ( ! (X % rad) ) poz = X / rad;
	else poz = X / rad + 1;
	
	A[X] -= Y;
	sums[poz] -= Y;
}



int query (int X, int Y)
{
	int start = 0;
	
	if (X % rad == 1 || ! (X % rad) ) start = X / rad + 1;
	else start = X / rad + 2;
	
	int end = 0;
	
	end = Y / rad;
	
	int S = 0;
	
	if (start > end)
	{
		for (int i = X; i <= Y; ++ i)
			S += A[i];
		
		return S;
	}

	for (int i = start; i <= end; ++ i)
		S += sums[i];
	for (int i = X; i <= (start - 1) * rad; ++ i)
		S += A[i];
	for (int i = end * rad + 1; i <= Y; ++ i)
		S += A[i];
	
	
	return S;
}



int main()
{
	freopen ("datorii.in", "r", stdin);
	freopen ("datorii.out", "w", stdout);
	
	int N, M;
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= N; ++ i)
		scanf ("%d", &A[i]);
	
	
	rad = (int) sqrt ( (double) N );
	int dim = N / rad;
	
	
	for (int i = 1; i <= dim; ++ i)
		for (int j = (i - 1) * rad + 1; j <= i * rad; ++ j)
			sums[i] += A[j];
	
	
	if (rad * dim < N)
	{
		++ dim;
		
		for (int i = rad * (dim - 1) + 1; i <= N; ++ i)
			sums[dim] += A[i];
	}
	
	
	for (int i = 1; i <= M; ++ i)
	{
		int type, X, Y;
		
		scanf ("%d %d %d", &type, &X, &Y);
		
		if (! type) update (X, Y);
		else printf ("%d\n", query (X, Y));
	}
	
	
	return 0;
}