Cod sursa(job #3368211)

Utilizator RZV139fjDragomir Ioan Razvan RZV139fj Data 13 octombrie 2026 16:09:27
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;
const int MAXN=15205;
const int MAXB=200;
ifstream fin("datorii.in");
ofstream fout("datorii.out");


struct node{
    int sum;
};

struct sqrt_dec{
    int v[MAXN];
    node b[MAXB];
    int nb=0;
    int n=0;
    int bs=0;

    void init(int lung)
    {
        int n=lung;
        nb=sqrt(n+1);
        bs=n/nb+1;
        for(int i=0;i<n;i++)
        {
            fin>>v[i];
        }
    }

    void build()
    {
        for(int i=0;i<nb;i++)
        {
            int start=i*bs;
            for(int j=0;j<bs;j++)
            {
                b[i].sum+=v[j+start];
            }
        }
    }

    int suma_vec(int *v, int l, int r)
    {
        int suma=0;
        for(int i=l;i<r;i++)
        {
            suma+=v[i];
        }
        return suma;
    }

    int suma_buc(node *v, int l, int r)
    {
        int suma=0;
        for(int i=l;i<r;i++)
        {
            suma+=v[i].sum;
        }
        return suma;
    }


    int suma_frag(int l,int r)
    {
        return suma_vec(v,l,r);
    }

    int suma_bucket(int l, int r)
    {
        return suma_buc(b,l,r);
    }

    int query(int l, int r)
    {
        int bl=l/bs;
        int br=r/bs;
        if(bl==br)
        {
            return suma_frag(l,r);
        }
        else
        {
            int rasp=0;
            rasp+=suma_frag(l,(bl+1)*bs);
            rasp+=suma_frag(br*bs,r);
            rasp+=suma_bucket(bl+1,br);
            return rasp;
        }
    }

    void add(int poz, int x)
    {
        v[poz]+=x;
        b[poz/bs].sum+=x;
    }


};

sqrt_dec decomp;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n,m;
    fin>>n>>m;

    decomp.init(n);
    decomp.build();

    for(int i=1;i<=m;i++)
    {
        int tip;
        fin>>tip;
        if(tip==0)
        {
            int poz,val;
            fin>>poz>>val;
            decomp.add(poz-1,-val);
        }
        else
        {
            int l,r;
            fin>>l>>r;
            fout<<decomp.query(l-1,r)<<'\n';
        }
    }

    return 0;
}