Cod sursa(job #3252338)

Utilizator ElideMaria Popescu Elide Data 29 octombrie 2024 11:13:13
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <math.h>

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

int v[15005], v_r[130], rad;

void update(int poz, int val)
{
    int ind_bloc = (poz + rad - 1) / rad;
    v[poz] -= val;
    v_r[ind_bloc] -= val;
}

void sum(int st, int dr)
{
    int suma = 0;
    int ind_bloc_st = (st + rad - 1) / rad;
    int ind_bloc_dr = (dr + rad - 1) / rad;
    if(ind_bloc_dr == ind_bloc_st)
    {
        while(st <= dr)
        {
            suma += v[st];
            st++;
        }
    } else
    {
        while(st % rad != 1)
        {
            suma += v[st];
            st++;
        }
        while(dr % rad != 0)
        {
            suma += v[dr];
            dr--;
        }
        while(st < dr)
        {
            suma += v_r[(st + rad - 1) / rad];
            st += rad;
        }
    }
    out << suma << '\n';
}

int main()
{
    bool cerinta;
    int n, m, i, a, b;
    in >> n >> m;
    rad = (int) sqrt(n) + 1;
    for(i = 1; i <= n; i++)
    {
        in >> v[i];
        v_r[(i + rad - 1)/rad] += v[i];
    }
    for(i = 1; i <= m; i++)
    {
        in >> cerinta >> a >> b;
        if(cerinta == 0)
        {
            update(a, b);
        } else
        {
            sum(a, b);
        }
    }
    return 0;
}