Pagini recente » Cod sursa (job #60352) | Cod sursa (job #2252022) | Cod sursa (job #1350838) | Cod sursa (job #1197449) | Cod sursa (job #2455229)
// ============================================================================
#include <stdio.h>
// ============================================================================
#define zeros(x) ((x^(x-1))&x)
// ============================================================================
using namespace std;
// ============================================================================
void adauga_datorie (int zi, int datorie);
void plata (int zi, int suma);
int rest_plata (int zis);
// ============================================================================
int datorii [15002];
int n, m;
// ============================================================================
int main (void)
{
// ------------------------------------------------------------------------
int tip;
int zi, suma;
int zis, zif;
FILE *input;
FILE *output;
// ------------------------------------------------------------------------
// Initial file read.
input = fopen ("datorii.in", "r");
output = fopen ("datorii.out", "w");
fscanf (input, "%d %d", &n, &m);
for (zi = 1; zi <= n; zi++)
{
fscanf (input, "%d", &suma);
adauga_datorie (zi, suma);
}
// ------------------------------------------------------------------------
// Reading and processing the rest of the file.
while (m--)
{
fscanf (input, "%d ", &tip);
if (tip == false)
{
fscanf (input, "%d %d", &zi, &suma);
plata (zi, suma);
}
else
{
fscanf (input, "%d %d", &zis, &zif);
suma = rest_plata (zif) - rest_plata (zis - 1);
fprintf(output, "%d\n", suma);
}
}
// ------------------------------------------------------------------------
fclose (input);
fclose (output);
// ------------------------------------------------------------------------
return 0;
}
// ============================================================================
void adauga_datorie (int zi, int datorie)
{
for (int i = zi; i <= n; i += zeros (i))
{
datorii [i] += datorie;
}
}
// ============================================================================
void plata (int zi, int suma)
{
for (int i = zi; i <= n; i += zeros (i))
{
datorii [i] -= suma;
}
}
// ============================================================================
int rest_plata (int zi_start)
{
int plata = 0;
for (int zi = zi_start; zi > 0; zi -= zeros (zi))
{
plata += datorii [zi];
}
return plata;
}
// ============================================================================