Cod sursa(job #1328980)

Utilizator radu_uniculeu sunt radu radu_unicul Data 28 ianuarie 2015 22:08:23
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include<stdio.h>

FILE *fin=fopen("datorii.in", "r");
FILE *fout=fopen("datorii.out", "w");
int N,M,q[15000],K=0;
int A[35000];
void adauga (int k,int s, int d,int x, int y)
{
    A[k]+=y;
    if(s!=d)
    {
        if(x<=(s+d)/2)
        {
            adauga(2*k,s,(s+d)/2,x,y);
        }
        else
        {
            adauga(2*k+1,(s+d)/2+1,d,x,y);
        }
    }
}

void scade (int k, int s, int d, int x, int y)
{
    A[k]-=y;
    if(s!=d)
    {
        if(x<=(s+d)/2)
        {
            scade(2*k,s,(s+d)/2,x,y);
        }
        else
        {
            scade(2*k+1,(s+d)/2+1,d,x,y);
        }
    }
}

void query(int k,int s, int d,int x, int y)
{
    if(x<=s && y>=d)
    {
        K+=A[k];
    }
    else
    {
        int z=(s+d)/2;
        if(y>z)
            query(k*2+1,(s+d)/2+1,d,x,y);
        if(x<=z)
            query(k*2,s,(s+d)/2,x,y);
    }
}

void citire ()
{
    fscanf (fin, "%d %d", &N, &M);
    for(int i=1; i<=N; i++)
    {
        int x;
        fscanf(fin, "%d", &x);
        adauga(1,1,N,i,x);
    }
}

void rezolvare ()
{
    for(int i=1; i<=M; i++)
    {
        int x,y,z;
        fscanf(fin, "%d %d %d", &x, &y, &z);
        if(!x)
        {
            scade(1,1,N,y,z);
        }
        else
        {
            K=0;
            query(1,1,N,y,z);
            fprintf(fout,"%d\n",K);
        }
    }
}

int main ()
{
    citire ();
    rezolvare ();
    return 0;
}