Cod sursa(job #1328882)

Utilizator radu_uniculeu sunt radu radu_unicul Data 28 ianuarie 2015 20:51:39
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<cstdio>
using namespace std;
int m,n,arb[301000],i,x,y,mid;
FILE *fin,*fout;
void add(int l,int r,int p,int nod)
{
    if(l==r)
    {
        arb[nod]+=x;
        return;
    }
    mid=(l+r)/2;
    if(l>r) add(l,mid,p,nod*2);
    else add(mid+1,r,p,nod*2+1);
}
int sum(int l,int r,int l1,int r1,int nod)
{
    if(l==l1&&r==r1)
    {
        //fprintf(fout,"%d",arb[nod]);
        return arb[nod];
    }
    mid=(l+r)/2;
    if(l1>mid) return sum(mid+1,r,l1,r1,2*nod+1);
    if(r1<=mid) return sum(l,mid,l1,r1,2*nod);
    return sum(l,mid,l1,mid,2*nod) + sum(mid+1, r, mid+1, r1, 2*nod+1);
}
int main()
{
    fin=fopen("datorii.in","r");
    fout=fopen("datorii.out","w");
    fscanf(fin,"%d%d",&n,&m);
    for(i=1; i<=n; i++)
    {
        fscanf(fin,"%d",&x);
        add(1,n,i,1);
    }
    for(i=1; i<=m; i++)
    {
        bool flag;
        fscanf(fin,"%d%d%d",&flag,&x,&y);
        if(flag==0)
        {
            x=-x;
            add(1,n,x,1);
        }
        else
        {
            fprintf(fout,"%d\n",sum(1,n,x,y,1));
        }
    }
}