Cod sursa(job #1146181)

Utilizator kiralalaChitoraga Dumitru kiralala Data 18 martie 2014 19:40:50
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#define NMAX 15005
#define MMAX 100005
#define FOR(a,b,i) for(int (i)=(a);(i)<(b);++(i))

using namespace std;

FILE* f=freopen("datorii.in","r",stdin);
FILE* o=freopen("datorii.out","w",stdout);

int n,m,pos,val,lf,rt,sum;
int dat[NMAX*2];

void Update(int l, int r, int nod)
{
    int mj=(l+r)/2;
    if(l==r)
    {
        dat[nod]-=val;
        return;
    }
    else
    {
        if(pos>mj)
        {
            Update(mj+1,r,2*nod+1);
        }
        else
        {
            Update(l,mj,2*nod);
        }
        dat[nod]=dat[nod*2]+dat[nod*2+1];
    }
}

void Query(int l, int r, int nod)
{
    int mj=(l+r)/2;
    if(l>=lf&&r<=rt)
        sum+=dat[nod];
    else
    {
        if(mj<rt)
            Query(mj+1,r,2*nod+1);
        if(mj>=lf)
            Query(l,mj,2*nod);
    }
}

int main()
{
    scanf("%d%d",&n,&m);

    FOR(1,n+1,i)
    {
        int x;
        scanf("%d",&x);
        pos=i;
        val=-x;
        Update(1,n,1);
    }

    FOR(1,m+1,i)
    {
        int p;
        int a,b;
        scanf("%d",&p);
        scanf("%d%d",&a,&b);
        if(p==0)
        {
            pos=a;
            val=b;
            Update(1,n,1);
        }
        else
        {
            lf=a,rt=b;
            sum=0;
            Query(1,n,1);
            printf("%d\n",sum);
        }
    }

    return 0;
}