Cod sursa(job #3159885)

Utilizator TeodorVTeodorV TeodorV Data 22 octombrie 2023 13:48:30
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NAint=1<<16;

int n;
int aint[NAint];

void buildAint(int node=0, int st=1, int dr=n)
{
    if(st==dr)
    {
        fin>>aint[node];
        return;
    }
    int mij=(st+dr)/2;
    buildAint(2*node+1, st, mij);
    buildAint(2*node+2, mij+1, dr);
    aint[node]=aint[2*node+1]+aint[2*node+2];
}
void updateAint(const int& pos, const int& dif, int node=0, int st=1, int dr=n)
{
    if(pos<st || dr<pos)
        return;
    aint[node]-=dif;
    if(st==dr)
        return;
    int mij=(st+dr)/2;
    updateAint(pos, dif, 2*node+1, st, mij);
    updateAint(pos, dif, 2*node+2, mij+1, dr);
}

int queryAint(const int& qst, const int& qdr, int node=0, int st=1, int dr=n)
{
    if(dr<qst || qdr<st)
        return 0;
    if(qst<=st && dr<=qdr)
        return aint[node];
    int mij=(st+dr)/2;
    return queryAint(qst, qdr, 2*node+1, st, mij)+queryAint(qst, qdr, 2*node+2, mij+1, dr);
}

int main()
{
    int m;
    fin>>n>>m;
    buildAint();
    for(int q=1; q<=m; q++)
    {
        int C,a,b;
        fin>>C>>a>>b;
        if(C==0)
        {
            updateAint(a, b);
        }
        else
        {
            fout<<queryAint(a, b)<<'\n';
        }
    }
    return 0;
}