Cod sursa(job #3293059)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 10 aprilie 2025 11:07:12
Problema Datorii Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#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;
}