Cod sursa(job #881104)
#include <stdio.h>
#include <stdlib.h>
typedef struct {
short operatie;
int first, second;
} Operatie;
int N, M;
int *datorii;
Operatie *operatii;
int sumePartiale[151];
FILE *fout;
void citire()
{
FILE *fin = fopen("datorii.in", "r");
if (fin == NULL) perror("Error reading file!");
fscanf(fin, "%d %d", &N, &M);
datorii = (int *) malloc ((N + 1) * sizeof(int));
operatii = (Operatie *) malloc ((M + 1) * sizeof(Operatie));
for (int index = 1; index <= N; index++)
fscanf(fin, "%d ", &datorii[index]);
for (int index = 1; index <= M; index++)
{
int op, first, second;
fscanf(fin, "%d %d %d", &op, &first, &second);
operatii[index].operatie = op;
operatii[index].first = first;
operatii[index].second = second;
}
fclose(fin);
}
void creareSumePartiale()
{
for (int index = 0; index <= 150; index ++)
sumePartiale[index] = 0;
for (int index = 1; index <= N; index ++)
sumePartiale[index / 100] += datorii[index];
}
void actualizeaza(int index, int value)
{
datorii[index] -= value;
sumePartiale[index / 100] -= value;
}
int interogare(int start, int finish)
{
int startGroup = start / 100;
if (start % 100 == 0) startGroup--;
int endGroup = finish / 100;
int result = 0;
for (int index = startGroup + 1; index < endGroup; index ++)
result += sumePartiale[index];
while (start % 100 != 0 && start <= finish)
{
result += datorii[start];
start ++;
}
while (finish % 100 != 0 && finish >= start)
{
result += datorii[finish];
finish --;
}
if (start < finish)
result += datorii[finish];
return result;
}
void procesare()
{
fout = fopen("datorii.out", "w");
for (int cursor = 1; cursor <= M; cursor ++)
{
Operatie opCurent = operatii[cursor];
if (opCurent.operatie == 0)
actualizeaza(opCurent.first, opCurent.second); //zero-based index
else
{
int sum = interogare(opCurent.first, opCurent.second); //zero-based index
fprintf(fout, "%d\n", sum);
}
}
fclose(fout);
}
int main()
{
citire();
creareSumePartiale();
procesare();
return 0;
}