Cod sursa(job #1310242)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 6 ianuarie 2015 16:55:00
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 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;
	if(bucata[st] != bucata[dr])
	{
		while(st % rad != 1)
		{
			rez += v[st];
			st++;
		}
		while(bucata[st] != bucata[dr])
		{
			rez += suma[bucata[st]];
			st += rad;
		}
	}
	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;
}