Cod sursa(job #644678)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 7 decembrie 2011 12:36:12
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

#define max_s 50000

using namespace std;

int i,n,m,poz,x,a,b,op,sum,k;
int arb[1<<14];
bool ok;
char s[max_s];

void actualizare(int nod,int st,int dr) {
	if (poz<=st && dr<=poz) {
		arb[nod]+=x;
		return;
	}
	int m=(st+dr)/2;
	if (poz<=m) actualizare(nod<<1,st,m);
	       else actualizare((nod<<1)+1,m+1,dr);
	arb[nod]=arb[nod<<1]+arb[(nod<<1)+1];
}

void interogare(int nod,int st,int dr) {
	if (a<=st && dr<=b) {
		sum+=arb[nod];
		return;
	}
	int m=(st+dr)>>1;
	if (a<=m) interogare(nod<<1,st,m);
	if (b>m) interogare((nod<<1)+1,m+1,dr);
}

int main () {
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	
	gets(s);
	
	i=k=0;
	while (k<n) {
		x=0;
		while(s[i]>='0' && s[i]<='9') {
			x*=10;
			x+=s[i]-'0';
			i++;
		}
		poz=k+1;
		k++;
		actualizare(1,1,n);
		i++;
	}
	
	for (i=1; i<=m; i++) {
		scanf("%d%d%d",&op,&a,&b);
		if (op==0) {
			poz=a;
			x=-b;
			actualizare(1,1,n);
		}
		else
			if (op==1) {
				sum=0;
				interogare(1,1,n);
				printf("%d\n",sum);
			}
	}
	return 0;
}