Cod sursa(job #1778089)

Utilizator denniscrevusDennis Curti denniscrevus Data 13 octombrie 2016 14:07:57
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#define NMAX 15005
using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

int arb[100000], n, m, i, b, caz, a, v[NMAX];

void update(const int &st, const int &dr, const int &poz, const int &nod )
{
    if(st==dr)
    {
        arb[nod]=v[poz];
        return;
    }
    int sfiu = (nod<<1);
    int dfiu = ((nod<<1)+1);
    int mij = ((st+dr)>>1);
    if(poz<=mij) update(st,mij,poz,sfiu);
    if(poz>mij) update(mij+1,dr,poz,dfiu);
    arb[nod] = arb[sfiu] + arb[dfiu];
}

int querry(const int &st, const int &dr, const int &st1, const int &dr1, const int &nod)
{
    if(st==st1 && dr==dr1)
        return arb[nod];
    int sfiu=(nod<<1);
    int dfiu=((nod<<1)+1);
    int mij=((st+dr)>>1);
    if(dr1<=mij)
        return querry(st,mij,st1,dr1,sfiu);
    if(st1>mij)
        return querry(mij+1,dr,st1,dr1,dfiu);
    return (querry(st,mij,st1,mij,sfiu) + querry(mij+1,dr,mij+1,dr1,dfiu));
}

int main()
{
    f>>n>>m;

    for(i=1;i<=n;i++)
    {
        f>>v[i];
        update(1,n,i,1);
    }
    //for(i=1;i<=50;i++)
        //g<<arb[i]<<" ";
    for(i=1;i<=m;i++)
        {
            f>>caz;
            f>>a>>b;

            if(!caz)
            {
                v[a]-=b;
                update(1,n,a,1);
            }
            else
                g<<querry(1,n,a,b,1)<<"\n";
        }
}