Cod sursa(job #1205354)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 6 iulie 2014 11:31:49
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#define MX 15001
using namespace std;

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

int n,m;
int a[3*MX];
int p1,p2;

inline void update(int nod, int left, int right)    //p1 = poz, p2 = val
{
    if(left == right)
    {
        a[nod] += p2;
        return;
    }

    int mid = (left+right)>>1;
    if(p1 <= mid) update(nod<<1, left, mid);
    else update((nod<<1)+1, mid+1, right);

    a[nod] = a[nod<<1] + a[(nod<<1)+1];
}

inline int query(int nod, int left, int right)
{
    if(p1<=left && right<=p2)
    {
        return a[nod];
    }

    int mid = (left+right)>>1;
    int s,d;
    s = d = 0;

    if(p1 <= mid)
    {
        s = query(nod<<1, left, mid);
    }

    if(mid < p2)
    {
        d = query((nod<<1)+1, mid+1, right);
    }

    return s+d;
}

void citire()
{
    int i;
    fin>>n>>m;
    for(i=1; i<=n; i++)
    {
        p1 = i;
        fin>>p2;
        update(1, 1, n);
    }
}

int main()
{
    citire();
    int i,x;

    for(i=1; i<=m; i++)
    {
        fin>>x;
        if(x == 0)
        {
            fin>>p1>>p2;
            p2 *= -1;
            update(1, 1, n);
        }
        else
        {
            fin>>p1>>p2;
            fout<<query(1, 1, n);
            fout<<'\n';
        }
    }

    fin.close(); fout.close();
    return 0;
}