Cod sursa(job #1236942)

Utilizator sebinechitasebi nechita sebinechita Data 2 octombrie 2014 20:39:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
#define MAX 15002

int a[4*MAX], ind, val, minim, l, r, n, b[MAX];

void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        a[nod] = val;
        return;
    }
    int mij=(st+dr)>>1;
    if(ind<=mij)
        update(2*nod, st, mij);
    else
        update(2*nod+1, mij+1, dr);
    a[nod]=a[2*nod]+a[2*nod+1];
}

void query(int nod, int st, int dr)
{
    if(l <= st && dr <= r)
    {
        minim+=a[nod];
        return;
    }
    int mij=(st+dr)>>1;
    if(l<=mij)
    {
        query(2*nod, st, mij);
    }
    if(mij+1<=r)
    {
        query(2*nod+1, mij+1, dr);
    }
}

void U(int i, int v)
{
    ind = i;
    val = v;
    update(1, 1, n);
}

int Q(int st, int dr)
{
    l = st;
    r = dr;
    minim = 0;
    query(1, 1, n);
    return minim;
}

int main()
{
    int m, i, x, y, t;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>b[i];
        U(i, b[i]);
    }
    while(m--)
    {
        fin>>t>>x>>y;
        if(t==0)
        {
            b[x]-=y;
            U(x, b[x]);
        }
        else
            fout<<Q(x, y)<<"\n";
    }
}