Cod sursa(job #932364)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 28 martie 2013 21:03:19
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#define In "datorii.in"
#define Out "datorii.out"
#define NMAX 15000
using namespace std;

int AIB[NMAX+2],n;
/*
AIB[i] = suma elementelor dintre i-2^k+1 si i
k = numarul de zerouri terminale din reprezentarea binara a lui i
k = i&(-i);
*/

//creste intervalele care il contin pe poz cu i
inline void Update(int poz,int val)
{
    while(poz<=n)
    {
        AIB[poz]+=val;
        poz+=poz&(-poz);
    }
}

//returneaza suma elementelor de la 1 la poz
inline int Query(int poz)
{
    int sum = 0;
    while(poz>0)
    {
        sum+=AIB[poz];
        poz-=poz&(-poz);
    }
    return sum;
}

int main()
{
    int i,m,s1,s2,p,q,x;
    bool op;
    ifstream fin(In);
    ofstream fout(Out);
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        Update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        fin>>op>>p>>q;
        if(op)
        {
            s1 = Query(q);
            s2 = Query(p-1);
            fout<<s1-s2<<"\n";
        }
        else
            Update(p,-q);
    }
    fin.close();
    fout.close();
    return 0;
}