Cod sursa(job #1338568)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 10 februarie 2015 09:25:09
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<stdio.h>

int a[15001],arb[30000];

void create(int nod,int x,int y)
{
    if(x>y)
    {
        return;
    }
    else if(x==y)
    {
        arb[nod]=a[x];
        return;
    }

    create(2*nod,x,(x+y)/2);
    create(2*nod+1,(x+y)/2+1,y);

    arb[nod]=arb[nod*2]+arb[nod*2+1];
}

int check(int nod,int st,int dr,int x,int y)
{
    if(st==x&&dr==y)
    {
        return arb[nod];
    }
    int mij=(st+dr)/2;
    if(y<=mij)
    {
        return check(nod*2,st,mij,x,y);
    }
    else if(x>mij)
    {
        return check(nod*2+1,mij+1,dr,x,y);
    }
    else
    {
        return check(nod*2,st,mij,x,mij)+check(nod*2+1,mij+1,dr,mij+1,y);
    }
}

int main()
{
    FILE *fin,*fout;
    fin=fopen("datorii.in","r");
    fout=fopen("datorii.out","w");
    int n,m,t,t2;
    fscanf(fin,"%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&a[i]);
    }
    create(1,1,n);
    for(int i=1;i<=m;i++)
    {
        fscanf(fin,"%d",&t);
        if(t==0)
        {
            fscanf(fin,"%d %d",&t,&t2);
            while(t!=0)
            {
                arb[t]-=t2;
                t/=2;
            }
        }
        else
        {
            fscanf(fin,"%d %d",&t,&t2);
            fprintf(fout,"%d\n",check(1,1,n,t,t2));
        }
    }
}