Cod sursa(job #1043154)

Utilizator rucarRucareanu Alexandru rucar Data 28 noiembrie 2013 01:59:33
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#include <stdlib.h>

struct interval{
	int left, right, val;
};

void create(interval *arb,int *v, int poz, int st, int dr)
{
	if (st == dr)
	{
		arb[poz].val = v[st];
		arb[poz].left = st;
		arb[poz].right = dr;
		return;
	}
	create(arb, v, poz * 2, st, (st + dr) / 2);
	create(arb, v, poz * 2 + 1, (st + dr) / 2 + 1, dr);
	arb[poz].left = st;
	arb[poz].right = dr;
	arb[poz].val = arb[poz * 2].val + arb[poz * 2 + 1].val;
}

void actualizare(interval*arb,int poz, int a, int b,int s)
{
	if (a <= arb[poz].left && b >= arb[poz].right)
		arb[poz].val -= s;
	else
	{
		int mij = (arb[poz].left + arb[poz].right) / 2;
		if (a <= mij)
			actualizare(arb, 2 * poz, a, b, s);
		if (b > mij)
			actualizare(arb, 2 * poz + 1, a, b, s);
		arb[poz].val = arb[poz * 2].val + arb[poz * 2 + 1].val;
	}
}

int afla(interval*arb, int poz, int a, int b)
{
	if (a == arb[poz].left && b == arb[poz].right)
		return arb[poz].val;
	else
	{
		int sl = 0, sr = 0, mij = (arb[poz].left + arb[poz].right) / 2 ;
		if (a <= mij)
			sl = afla(arb, 2 * poz, a, mij);
		if (b>=mij)
			sr = afla(arb, 2 * poz + 1, mij+1, b);
		return sl + sr;
	}
}

int main()
{
	int i, n, m, s, cod,p,q,t;
	FILE *f = fopen("datorii.in", "r"), *g = fopen("datorii.out", "w");
	fscanf(f, "%d%d", &n, &m);
	int *v = (int*)malloc(sizeof(int)*n);
	for (i = 0; i < n; i++)
	{
		fscanf(f, "%d", &v[i]);
	}
	interval *arb = (interval*)malloc(sizeof(interval)*2*n);
	create(arb, v, 1, 0, n - 1);
	for (i = 0; i < m; i++)
	{
		fscanf(f, "%d", &cod);
		if (cod)
		{
			fscanf(f, "%d%d", &p, &q);
			fprintf(g, "%d\n", afla(arb,1,p-1,q-1));
		}
		else
		{
			fscanf(f, "%d%d", &t, &s);
			actualizare(arb, 1, t-1, t-1, s);
		}
	}
}