Cod sursa(job #3252317)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 29 octombrie 2024 10:27:17
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <fstream>
#include <cmath>

using namespace std;

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

int n, q, v[15005], bc[200], rad, nrb;

int st_bucket(int b)
{
    return (b - 1) * rad + 1;
}

int dr_bucket(int b)
{
    return min(n, b * rad);
}

int find_bucket(int poz)
{
    if(poz % rad == 0)
        return poz / rad;

    return poz / rad + 1;
}

int main()
{
    f >> n >> q;
    rad = sqrt(n);

    nrb = 1;
    for(int i = 1; i <= n; i ++)
    {
        f >> v[i];
        if(i <= dr_bucket(nrb))
            bc[nrb] += v[i];

        if(i == dr_bucket(nrb)) nrb ++;
    }

    for(int i = 1; i <= q; i ++)
    {
        int op, x, y;
        f >> op >> x >> y;
        if(op == 0)
        {
            int b = find_bucket(x);
            y = min(y, v[x]);
            bc[b] -= y; v[x] -= y;
        }

        else
        {
            int b1 = find_bucket(x), b2 = find_bucket(y), sumi = 0;
            if(b1 == b2)
            {
                for(int j = x; j <= y; j ++)
                    sumi += v[j];

                g << sumi << '\n';
                continue;
            }

            if(x != st_bucket(b1))
                for(int j = x; j <= dr_bucket(b1); j ++)
                    sumi += v[j];
            else
                b1 --;

            if(y != dr_bucket(b2))
                for(int j = st_bucket(b2); j <= y; j ++)
                    sumi += v[j];
            else
                b2 ++;

            for(int j = b1 + 1; j < b2; j ++)
                sumi += bc[j];

            g << sumi << '\n';
        }
    }
    return 0;
}