Cod sursa(job #2205883)

Utilizator DimaTCDima Trubca DimaTC Data 20 mai 2018 15:40:32
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<bits/stdc++.h>
#define L 2*nod
#define R 2*nod|1
using namespace std;

int a[15010], H[35000], n,m, nr, idx, f, l, r;

void build(int st, int dr, int nod) {
	if (st==dr) {
		H[nod] = a[st];
		return;
	}
	int mid = st+dr >> 1;
	build(st, mid, L);
	build(mid+1, dr, R);
	H[nod] = H[L] + H[R];
}

void update(int st, int dr, int nod) {
	if (st==dr) {
		H[nod]-=nr;
		return;
	} 
	
	int mid = st+dr >> 1;
	if (idx <= mid) update(st, mid, L);
	else update(mid+1, dr, R);
	H[nod] = H[L] + H[R];
}

int query(int st, int dr, int nod) {
	if (l<=st && dr<=r) return H[nod];
	
	int mid = st+dr >> 1;
	int left = 0, right = 0;
	if (l<=mid) left = query(st, mid, 2*nod);
	if (r>mid) right = query(mid+1, dr, 2*nod+1);
	
	return left + right;
}


int main() {
	ifstream cin("datorii.in");
	ofstream cout("datorii.out");
	
	cin>>n>>m;
	for (int i=1; i<=n; i++) cin>>a[i];
	build(1,n,1); //cream arborele de intervale
	
	for (int i=0; i<m; i++) {
		cin>>f;
		if (f) {
			cin>>l>>r; //p-ru operatie de tip 1 interogam [l,r]
			cout<<query(1,n,1)<<'\n';
		} else {
			cin>>idx>>nr; //p-ru operatia de tip 0 actualizam arborele 
			update(1, n, 1);
		}
	}
	return 0;
}