Cod sursa(job #1500501)

Utilizator AlexandraaaaMereu Alexandra Alexandraaaa Data 12 octombrie 2015 01:57:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <string>
#include <iostream>
#include <fstream>
#include <algorithm>
#define maxN 15005 * 4

using namespace std;

int A[maxN], p, v, a, b, S;

void update(int l, int r, int i){
	if (l == r){
		A[i] += v;
		return;
	}

	int m = (l + r) >> 1;
	if (m >= p)
		update(l, m, i << 1);
	else
		update(m + 1, r, (i << 1) + 1);

	A[i] = A[i << 1] + A[(i << 1) + 1];
}

void vezi(int l, int r, int i){
	if (l >= a && r <= b){
		S += A[i];
		return;
	}

	int m = (l + r) >> 1;
	if (m >= a) vezi(l, m, i << 1);
	if (m < b) vezi(m + 1, r, (i << 1) + 1);
}

ifstream f("datorii.in");
ofstream g("datorii.out");
string s;
int pointer;

void initRead(){
	pointer = 0;
	getline(f, s, '~');
}

bool isDigit(char c) {
	return ('0' <= c && c <= '9');
}

int getInt() {
	while (!isDigit(s[pointer]))
		++pointer;
	int x = 0;
	while (isDigit(s[pointer]) && pointer < s.length()) {
		x = x * 10 + s[pointer] - '0';
		++pointer;
	}
	return x;
}

int main(){

	int n, m;

	initRead();
	n = getInt();
	m = getInt();
	for (int i = 1; i <= n; ++i){
		int x;
		x = getInt();
		p = i; v = x;
		update(1, n, 1);
	}

	for (int i = 0; i < m; ++i){
		int x, y, z;
		x = getInt();
		y = getInt();
		z = getInt();
		if (x == 0) {
			p = y;	v = -z;
			update(1, n, 1);
		}
		else{
			a = y;
			b = z;
			S = 0;
			vezi(1, n, 1);
			g << S << "\n";
		}
	}

	f.close();
	g.close();

	return 0;
}