Cod sursa(job #2225692)

Utilizator vlavricVictor Lavric vlavric Data 27 iulie 2018 23:48:43
Problema Datorii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
//#include <stdlib.h>

void 	readfrom(int *a, int b[100002][4], int *n, int *m)
{
	FILE *f; int i, j;

	f = fopen("datorii.in", "r");
	fscanf(f, "%d %d", n, m);
	for (i = 0; i < *n; i++)
		fscanf(f, "%d", &a[i]);
	for (i = 0; i < *m; i++)
	{
		for (j = 1; j <= 3; j++)
			fscanf(f, "%d", &b[i][j]);
	}
	fclose(f);
}

int ft_abs(int c)
{
	if (c < 0) c = c * (-1);
	return (c);
}

void update_tree(int *c, int n, int index, int val)
{
	index = index + 1;

	while (index <= n)
	{
		c[index] += val;
		index += index & (-index);
	}
}

int	get_sum(int *c, int index)
{
	int sum = 0;

	index++;

	while (index > 0)
	{
		sum += c[index];
		index -= index & (-index);
	}
	return (sum);
}

int	main()
{
	int a[15002], b[100002][4], c[15003]; int n, m, i;

	readfrom(a, b, &n, &m);
	for (i = 1; i < n + 1; i++)
		c[i] = 0;
	for (i = 0; i < n; i++)
		update_tree(c, n + 1, i, a[i]);
	FILE *g;

	g = fopen("datorii.out", "w");
	for (int i = 0; i < m; i++)
	{
		if (b[i][1] == 0)
		{
			update_tree(c, n, b[i][2] - 1, -b[i][3]);
		}
		else
		{
			fprintf(g, "%d\n", ft_abs(get_sum(c, b[i][2] - 2) - get_sum(c, b[i][3])));
		}
	}
	fclose(g);
	return (0);
}