Cod sursa(job #114567)

Utilizator andrei.12Andrei Parvu andrei.12 Data 14 decembrie 2007 21:04:43
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
int n, ptr, i, x, p, st, dr, suma, nr, val, v[16000], op, poz;
struct sgtree{
	int v, st, dr;
};
sgtree q[50000];
void cstr(int st, int dr, int poz){
	int x;
	q[poz].st = st;
	q[poz].dr = dr;
	if (st == dr)
		v[st] = poz;
	else{
		x = (st+dr) / 2;
		cstr(st, x, 2*poz);
		cstr(x+1, dr, 2*poz+1);
	}
}
void qr(int pz){
	if (q[pz].dr < st || q[pz].st > dr)
		return ;
	if (st <= q[pz].st && q[pz].dr <= dr)
		suma += q[pz].v;
	else{
		if (q[2*pz].st)
			qr(2*pz);
		if (q[2*pz+1].st)
			qr(2*pz+1);
	}
}
int main()
{
	freopen("datorii.in", "rt", stdin);
	freopen("datorii.out", "wt", stdout);
	scanf("%d%d", &n, &ptr);
	nr = 1;
	cstr(1, n, 1);
	for (i=1; i<=n; i++){
		scanf("%d", &x);
		p = v[i];
		while (p > 0){
			q[p].v += x;
			p = p / 2;
		}
	}
	for (i=1; i<=ptr; i++){
		scanf("%d", &op);
		if (!op){
			scanf("%d%d", &poz, &val);
			p = v[poz];
			while (p > 0){
				q[p].v -= val;
				p = p / 2;
			}
		}
		else{
			scanf("%d%d", &st, &dr);
			suma = 0;
			qr(1);
			printf("%d\n", suma);
		}
	}
	return 0;
}