Cod sursa(job #1498913)

Utilizator metrix007Lungu Ioan Adrian metrix007 Data 9 octombrie 2015 21:18:09
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 kb
/*#include <iostream>
#include <fstream>
#define NMAX 1503
using namespace std;

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

int n,m,v[NMAX],val,poz,t,a,b,sum,aib[NMAX];

void citire()
{
    in >> n >> m;
    for(int i=1;i<=n;i++)
        in >> v[i];
}

void update(int i,int delta)
{
    for(;i<=n;i=i+(i&(-i)))
    {
        aib[i] = aib[i] + delta;
    }
}

int sums(int i)
{
    int suma=0;
    for(;i>0;i=i-(i&(-i)))
    {
        suma+= aib[i];
    }
    return suma;
}



int main()
{
    citire();
    for(int i=1;i<=n;i++)
    {
        poz = i;
        val = v[i];
        update(poz,val);
    }

    for(int i=0;i<m;i++)
    {
        in>> t >> a >> b;
        if(t==0)
        {
            poz = a;
            val = (-1)*b;
            update(poz,val);
        }
        else
        {

            sum = 0;
            sum = sums(b) - sums(a-1);
            out << sum << "\n";
        }
    }

    return 0;
}
*/
#include <iostream>
#include <fstream>
#define NMAX 1503
#define NN 1 << 11
using namespace std;

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

int n,m,v[NMAX],intervale[NN],val,poz,t,a,b,sum;//aib[NMAX];

inline void citire()
{
    in >> n >> m;
    for(int i=1;i<=n;i++)
        in >> v[i];
}

inline void updateI(int nod,int st, int dr)
{
    int mij;

    if(st==dr)
    {
        intervale[nod] = intervale[nod] + val;
        return;
    }
    mij = (st+dr)/2;
    if(poz<=mij)
    {
        updateI(nod*2,st,mij);
    }
    else if(poz>mij)
    {
        updateI(nod*2+1,mij+1,dr);
    }
    intervale[nod] = intervale[nod*2]+intervale[2*nod+1];
}

inline void getsumI(int nod,int st,int dr)
{
    int mij;
    if(a<=st && dr<=b)
    {
        sum = sum + intervale[nod];
        return;
    }
    mij = (st+dr)/2;
    if(mij>=a) getsumI(nod*2,st,mij);
    if(mij<b) getsumI(nod*2+1,mij+1,dr);
}

int main()
{
    citire();
    for(int i=1;i<=n;i++)
    {
        poz = i;
        val = v[i];
        updateI(1,1,n);
    }
   // for(int i=1;i<=13;i++)
    //{
   //    cout << i << " " << intervale[i]  << endl;
   // }
    for(int i=0;i<m;i++)
    {
        in>> t >> a >> b;
        if(t==0)
        {
            poz = a;
            val = (-1)*b;
            updateI(1,1,n);
        }
        else
        {

            sum = 0;
            getsumI(1,1,n);
            out << sum << "\n";
        }
    }

    return 0;
}