Cod sursa(job #826284)

Utilizator maritimCristian Lambru maritim Data 30 noiembrie 2012 16:01:44
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>

FILE *f = fopen("datorii.in","r");
FILE *g = fopen("datorii.out","w");

#define MaxN 15100
#define mij ((li+ls)>>1)
#define fs (poz<<1)
#define fd ((poz<<1)+1)

int N,M;
int A[MaxN],AINT[4*MaxN];

void citire(void)
{
    fscanf(f,"%d %d",&N,&M);
    for(int i=1;i<=N;i++)
        fscanf(f,"%d ",&A[i]);
}

inline void build(int li,int ls,int poz)
{
    if(li == ls)
    {
        AINT[poz] = A[li];
        return ;
    }

    build(li,mij,fs);
    build(mij+1,ls,fd);

    AINT[poz] = AINT[fs]+AINT[fd];
}

inline void insert(int li,int ls,int poz,int pozVal,int val)
{
    if(li == ls)
    {
        AINT[poz] -= val;
        return ;
    }

    if(li <= pozVal && pozVal <= mij)
        insert(li,mij,fs,pozVal,val);
    else
        insert(mij+1,ls,fd,pozVal,val);

    AINT[poz] = AINT[fs]+AINT[fd];
}

inline int querry(int li,int ls,int poz,int a,int b)
{
    if(a <= li && ls <= b)
        return AINT[poz];

    int sum = 0;

    if(a <= mij)
        sum += querry(li,mij,fs,a,b);
    if(b > mij)
        sum += querry(mij+1,ls,fd,a,b);

    return sum;
}

int main()
{
    int op,a,b;

    citire();
    build(1,N,1);
    for(int i=1;i<=M;i++)
    {
        fscanf(f,"%d %d %d\n",&op,&a,&b);
        switch(op)
        {
            case 0 : insert(1,N,1,a,b);
                break;
            default : fprintf(g,"%d\n",querry(1,N,1,a,b));
        }
    }
}