Cod sursa(job #114441)

Utilizator andrei.12Andrei Parvu andrei.12 Data 14 decembrie 2007 10:51:19
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
int n, ptr, i, x, p, st, dr, suma, nr, val, v[16000], op, poz;
struct sgtree{
	int v, dc1, dc2, st, dr, p;
};
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
		if (st < dr)
		{
			x = (st+dr) / 2;
			nr ++;
			q[poz].dc1 = nr;
			q[nr].p = poz;
			cstr(st, x, nr);
			nr ++;
			q[poz].dc2 = nr;
			q[nr].p = poz;
			cstr(x+1, dr, nr);
		}
}
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{
		qr(q[pz].dc1);
		qr(q[pz].dc2);
	}
}
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 = q[p].p;
		}
		*/
	}
	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 = q[p].p;
			}
			*/
		}
		else{
			scanf("%d%d", &st, &dr);
			suma = 0;
			//qr(1);
			printf("%d\n", suma);
		}
	}
	return 0;
}