Cod sursa(job #3292936)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 9 aprilie 2025 19:48:28
Problema Datorii Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXN 15000

int v[MAXN + 123];
int aux[122 + 1];
int sq, ad = 0;

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 = sqrt + ad, m, sol = 0;
    while (st <= dr)
    {
        m = (st + dr) / 2;
        if (sq * (m - 1) <= poz)
        {
            sol = m;
            st = m + 1;
        }
        else
        {
            dr = m - 1;
        }
    }
    return sol + 1;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("datorii.in", "r");
    fout = fopen("datorii.out", "w");
    int N, M, i, j, k, tip, st, dr, p1, p2, pp1, pp2, suma;
    fscanf(fin, "%d%d", &N, &M);
    sq = rad(N);
    if (sq * sq != N)
    {
        ad = 1;
    }
    for (i = 1; i <= N; i++)
    {
        fscanf(fin, "%d", &v[i]);
    }
    j = 0;
    for (i = 1; i <= sqrt + ad; i++)
    {
        k = 0;
        while (k < sqrt && 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 + 1) - 1;
            pp2 = p2 * sq;
            while (pp1 != st)
            {
                suma += v[pp1];
                pp1--;
            }
            while (pp2 != dr)
            {
                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;
}