Cod sursa(job #2609733)

Utilizator radubigColtos Radu radubig Data 3 mai 2020 12:53:03
Problema Datorii Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#define lim 15000

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");

class AInt
{
private:
    int aint[4*lim+5]={0};

public:
    void build(int* src, int nod, int st, int dr)
    {
        if(st>dr) return;
        if(st==dr)
            aint[nod]=src[st];
        else
        {
            int mij = (st+dr)/2;
            build(src, 2*nod, st, mij);
            build(src, 2*nod+1, mij+1, dr);
            aint[nod] = aint[2*nod] + aint[2*nod+1];
        }
    }
    void update(int poz, int val, int nod, int st, int dr)
    {
        if(st>dr || poz<st || poz>dr) return;
        if(st==dr)
            aint[nod] -= val;
        else
        {
            int mij = (st+dr)/2;
            update(poz, val, 2*nod, st, mij);
            update(poz, val, 2*nod+1, mij+1, dr);
            aint[nod] = aint[2*nod] + aint[2*nod+1];
        }
    }
    int query(int ql, int qr, int nod, int st, int dr)
    {
        if(st>dr || qr<st || ql>dr) return 0;
        if(ql <= st && qr >= dr)
            return aint[nod];
        else
        {
            int mij = (st+dr)/2;
            int ansleft = query(ql, qr, 2*nod, st, mij);
            int ansright = query(ql, qr, 2*nod+1, mij+1, dr);
            return ansleft+ansright;
        }
    }
};

int v[lim+5],n,m;

int main()
{
    AInt aint;
    in>>n>>m;
    for(int i=1;i<=n;i++) in>>v[i];

    aint.build(v, 1, 1, n);

    for(int i=1;i<=m;i++)
    {
        int t,a,b;
        in>>t>>a>>b;
        if(t==0)
            aint.update(a,b,1,1,n);
        else
            out<<aint.query(a,b,1,1,n)<<'\n';
    }

    return 0;
}