Pagini recente » Cod sursa (job #3038358) | Cod sursa (job #3272434) | Cod sursa (job #644027) | Cod sursa (job #2851987) | Cod sursa (job #178323)
Cod sursa(job #178323)
#include<stdio.h>
#define INPUT "datorii.in"
#define OUTPUT "datorii.out"
#define NMAX 15001
FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");
long N, M, X, Y, Sum, code, taskCode;
long A[ NMAX ], Tree[ 5 * NMAX ];
void UpdateTree(long node, long left, long right)
{
long middle;
if(left == right)
{
if(taskCode == 2)
Tree[ node ] -= Y;
else
Tree[ node ] = Y;
return;
}
middle = (left + right) >> 1;
if(X <= middle)
UpdateTree(2 * node, left, middle);
else
UpdateTree(2 * node + 1, middle + 1, right);
Tree[ node ] = Tree[ 2 * node ] + Tree[ 2 * node + 1 ];
}
void QueryTree(long node, long left, long right)
{
long middle;
if(X <= left && right <= Y)
{
Sum += Tree[ node ];
return;
}
middle = (left + right) >> 1;
if(X <= middle)
QueryTree(2 * node, left, middle);
if(Y > middle)
QueryTree(2 * node + 1, middle + 1, right);
}
void readValues()
{
fscanf(fin, "%ld %ld", &N, &M);
for(long i = 1; i <= N; ++i)
{
fscanf(fin, "%ld", &A[ i ]);
X = i;
Y = A[ i ];
UpdateTree(1, 1, N);
}
}
void readNew()
{
fscanf(fin, "%ld %ld %ld", &code, &X, &Y);
}
int main()
{
taskCode = 1;
readValues();
for(long i = 0; i < M; ++i)
{
taskCode = 2;
readNew();
if(!code)
UpdateTree(1, 1, N);
else
{
Sum = 0;
QueryTree(1, 1, N);
fprintf(fout, "%ld\n", Sum);
}
}
fclose(fin);
fclose(fout);
return 0;
}