Cod sursa(job #3253643)

Utilizator Gabriel_DaescuDaescu Gabriel Florin Gabriel_Daescu Data 3 noiembrie 2024 22:30:46
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#define NMAX 15002
using namespace std;
ifstream  fin("datorii.in");
ofstream fout("datorii.out");
int N,M,A[NMAX],aint[4*NMAX];

void citire()
{
    fin>>N>>M;

    for(int i=1; i<=N; i++)
    {
        fin>>A[i];
    }
}

void build(int node, int st, int dr)
{
    if(st==dr)
    {
        aint[node]=A[st];
    }
    else
    {
        int pmijl=(st+dr)/2;
        build(node*2,st,pmijl);
        build(node*2+1,pmijl+1,dr);

        aint[node]=aint[2*node]+aint[2*node+1];
    }
}

void update(int val, int poz, int node, int st, int dr)
{
    if(st==dr)
    {
        aint[node]-=val;
    }
    else
    {
        int pmijl=(st+dr)/2;

        if(poz<=pmijl)
        {
            update(val,poz,2*node,st,pmijl);
        }
        else
        {
            update(val,poz,2*node+1,pmijl+1,dr);
        }

        aint[node]=aint[2*node]+aint[2*node+1];
    }
}

int query(int P, int Q, int node, int st, int dr)
{
    if(dr<P || st>Q)
    {
        return 0;
    }

    if(P<=st && dr<=Q)
    {
        return aint[node];
    }

    int pmijl=(st+dr)/2;
    int s1=query(P,Q,2*node,st,pmijl);
    int s2=query(P,Q,2*node+1,pmijl+1,dr);

    return s1+s2;
}

int main()
{
    int tip,T,P,V,Q;
    citire();

    build(1,1,N);

    for(int i=1; i<=M; i++)
    {
        fin>>tip;

        if(tip==0)
        {
            fin>>T>>V;
            update(V,T,1,1,N);
        }
        else
        {
            fin>>P>>Q;
            fout<< query(P,Q,1,1,N) << "\n";
        }
    }

    return 0;
}