Pagini recente » Cod sursa (job #3256270) | Cod sursa (job #1117264) | Cod sursa (job #2518199) | Cod sursa (job #635155) | Cod sursa (job #3293059)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 15000
int v[MAXN + 123];
int aux[122 + 1];
int sq, N;
int rad(int N)
{
int st = 1, dr = 123, m, sol = 1;
while (st <= dr)
{
m = (st + dr) / 2;
if (m * m <= N)
{
sol = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return sol;
}
int gaseste(int poz)
{
int st = 1, dr = N / sq, m, sol = 0;
while (st <= dr)
{
m = (st + dr) / 2;
if (sq * (m - 1) + 1 <= poz)
{
sol = m;
st = m + 1;
}
else
{
dr = m - 1;
}
}
return sol;
}
int main()
{
FILE *fin, *fout;
fin = fopen("datorii.in", "r");
fout = fopen("datorii.out", "w");
int M, i, j, k, tip, st, dr, p1, p2, pp1, pp2, suma;
fscanf(fin, "%d%d", &N, &M);
sq = rad(N);
for (i = 1; i <= N; i++)
{
fscanf(fin, "%d", &v[i]);
}
j = 0;
for (i = 1; i <= N / sq; i++)
{
k = 0;
while (k < sq && j < N)
{
k++;
j++;
aux[i] += v[j];
}
}
for (i = 1; i <= M; i++)
{
fscanf(fin, "%d%d%d", &tip, &st, &dr);
if (tip == 0)
{
v[st] -= dr;
p1 = gaseste(st);
aux[p1] -= dr;
}
else
{
suma = 0;
p1 = gaseste(st);
p2 = gaseste(dr);
pp1 = p1 * sq;
pp2 = (p2 - 1) * sq + 1;
if (p1 == p2)
{
for (pp1 = st; pp1 <= dr; pp1++)
{
suma += v[pp1];
}
}
else
{
while (pp1 != st - 1)
{
suma += v[pp1];
pp1--;
}
while (pp2 != dr + 1)
{
suma += v[pp2];
pp2++;
}
for (j = p1 + 1; j < p2; j++)
{
suma += aux[j];
}
}
fprintf(fout, "%d\n", suma);
}
}
fclose(fin);
fclose(fout);
return 0;
}