Cod sursa(job #1310231)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 6 ianuarie 2015 16:51:49
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <fstream>
#include <cmath>
using namespace std;
int n, Q, v[15100], rad, suma[205], bucata[15100];

inline void Update(int poz, int val)
{
	v[poz] -= val;
	suma[bucata[poz]] -= val;
}

inline int Query(int st, int dr)
{
	int rez = 0;
	while(bucata[st] != bucata[dr])
	{
		if(st % rad == 1)
		{
			rez += suma[bucata[st]];
			st += rad;
		}
		else
		{
			while(st % rad != 1)
			{
				rez += v[st];
				st++;
			}
		}
	}
	while(st <= dr)
	{
		rez += v[st];
		st++;
	}
	return rez;
}

int main()
{
	int i, j, tip, A, B;
	ifstream fin("datorii.in");
	ofstream fout("datorii.out");
	fin >> n >> Q;
	for(i = 1; i <= n; ++i)
		fin >> v[i];
	
	rad = (int)sqrt(1.0 * n) + 1;
	j = 1;
	for(i = 1; i <= n; ++i)
	{
		bucata[i] = j;
		suma[j] += v[i];
		if(i % rad == 0)
			j++;
	}
	
	while(Q--)
	{
		fin >> tip >> A >> B;
		if(tip == 0)
			Update(A, B);
		if(tip == 1)
			fout << Query(A, B) << "\n";
	}
	fin.close();
	fout.close();
	return 0;
}