Cod sursa(job #164783)

Utilizator c_sebiSebastian Crisan c_sebi Data 24 martie 2008 20:22:07
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>

#define DIM 32768


int A[DIM], n, m, maxim;

inline int Max(int a, int b){
	return a>b?a:b;
}


void update(int nod, int st, int dr, int poz, int val){
	if(st == dr){
		A[nod] += val;
	}
	else {
		int m = (st+dr)<<1;
		if(poz <= m) update(2*nod, st, m, poz, val);
		else update(2*nod+1, m+1, dr, poz, val);
		A[nod] = A[2*nod] + A[2*nod+1];
	}
}

int query(int nod, int st, int dr, int a, int b){
	if(a<=st && dr<=b)
		{return A[nod];}
	else{
		int m = (st+dr)<<1, v1=0, v2=0;
		if(a<=m) v1 = query(2*nod, st, m, a, b);
		if(b>m) v2 = query(2*nod+1, m+1, dr, a, b);
		return v1+ v2;
	}
}

int main(){
	int i, u, v, t;
	FILE *f=fopen("datorii.in", "r");
	FILE *g=fopen("datorii.out", "w");
	fscanf(f, "%d %d", &n, &m);
	for(i=1; i<=n; i++){
		fscanf(f, "%d", &u);
		update(1, 1, n, i, u);
	}
	for(i=1; i<=m; i++){
		fscanf(f, "%d %d %d", &t, &u, &v);
		if(t==0) update(1, 1, n, u, -v);
		else {maxim = query(1, 1, n, u, v); fprintf(g, "%d\n", maxim); }
	}

	fclose(f);
	fclose(g);
	return 0;
}