Cod sursa(job #2461948)

Utilizator GabyD002Dobrita Gabriel GabyD002 Data 26 septembrie 2019 16:16:26
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define NM 15005
#define iii int,int,int
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");

int n,m,a,b,sum,ai[4*NM];

void Read();
void Solve();
void MakeAi(iii);
void Update(iii);
void Query(iii);

int main()
{   Read();
    Solve();
    f.close();
    g.close();
    return 0;
}

void Read()
{   f>>n>>m;
    for(int i=1; i<=n; i++)
    {   a=i;
        f>>b;
        MakeAi(1,1,n);
    }
}

void Solve()
{   for(int t; m; m--)
    {   f>>t>>a>>b;
        if(t)
        {   sum=0;
            Query(1,1,n);
            g<<sum<<'\n';
        }
        else
            Update(1,1,n);
    }
}

void MakeAi(int nod,int st,int dr)
{   if(st==dr)
        ai[nod]=b;
    else
    {   int mij=(st+dr)/2;
        if(a>=st && a<=mij)
            MakeAi(2*nod,st,mij);
        else
            MakeAi(2*nod+1,mij+1,dr);
        ai[nod]+=b;
    }
}

void Update(int nod,int st,int dr)
{   if(st==dr)
        ai[nod]-=b;
    else
    {   int mij=(st+dr)/2;
        if(a>=st && a<=mij)
            Update(2*nod,st,mij);
        else
            Update(2*nod+1,mij+1,dr);
        ai[nod]-=b;
    }
}

void Query(int nod,int st,int dr)
{   if(st>=a && dr<=b)
        sum+=ai[nod];
    else
    {   int mij=(st+dr)/2;
        if(a<=mij)
            Query(2*nod,st,mij);
        if(mij<b)
            Query(2*nod+1,mij+1,dr);
    }
}