Cod sursa(job #406607)

Utilizator xtephanFodor Stefan xtephan Data 1 martie 2010 17:57:23
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>

long arb[60000];
int n,m;

void go();


int main() {
	
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	
	go();
	
	return 0;
}


void update(int i, int j, int p, int nod, int v) {
	
	if(i==j && j==p) {
		arb[nod]=v;
		return;
	}
	
	int mij=(i+j)/2;
	
	if(p<=mij)
		update(i,mij,p,nod*2,v);
	else
		update(mij+1,j,p,nod*2+1,v);
	
	arb[nod]=arb[nod*2]+arb[nod*2+1];
}

void update2(int i, int j, int p, int nod, int v) {
	
	if(i==j && j==p) {
		arb[nod]-=v;
		return;
	}
	
	int mij=(i+j)/2;
	
	if(p<=mij)
		update2(i,mij,p,nod*2,v);
	else
		update2(mij+1,j,p,nod*2+1,v);
	
	arb[nod]=arb[nod*2]+arb[nod*2+1];
}

long query(int i, int j, int x, int y, int nod) {
	
	if(x<=i && j<=y) 
		return arb[nod];
	
	int mij=(i+j)/2;
	
	long r=0;
	
	if(x<=mij)
		r+=query(i,mij,x,y,nod*2);
	if(mij<y)
		r+=query(mij+1,j,x,y,nod*2+1);
	
	return r;
}

void go() {
	
	int i,j;
	
	scanf("%d %d", &n, &m);
	
	for(i=1; i<=n; i++) {
		int x;
		scanf("%d", &x);
		update(1,n,i,1,x);
	}
	
	for(i=1; i<=m; i++) {
		int a,b,c;
		scanf("%d%d%d", &c, &a, &b);
		
		if(c) { //query = suma [a,b]
			
			long g = query(1,n,a,b,1);
			printf("%ld\n",g);
		
		}else { //update
			update2(1,n,a,1,b);
		}
	}
	
}