Cod sursa(job #854484)

Utilizator RamaStanciu Mara Rama Data 13 ianuarie 2013 17:36:37
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
using namespace std;
int A[3*15073],day,val,n,m,poz,nr,day1,day2,s;

int suma(int a,int b)
{
    return a+b;
}
void request(int nod,int st,int dr)
{
    int mid;
    if((day1<=st) && (day2>=dr))
    {
        s=s+A[nod];
        return;
    }
    mid=(st+dr)/2;
    if(day1<=mid) request(2*nod,st,mid);
    if(mid<day2) request(2*nod+1,mid+1,dr);
}
void achitare()
{
    int k=day;
    while(k)
    {
        A[k]=A[k]-val;
        k=k/2;
    }

}
void actualizare(int nod,int st,int dr)
{
    int mid;
    if(st==dr)
    {
        A[nod]=nr;
        return;
    }
    mid=(st+dr)/2;
    if(poz<=mid) actualizare(2*nod,st,mid);
        else actualizare(2*nod+1,mid+1,dr);
    A[nod]=suma(A[2*nod],A[2*nod+1]);
}
int main()
{
    int i,x,a,b,op;
    FILE*f,*g;
    f=fopen("datorii.in","r");
    g=fopen("datorii.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&x);
        poz=i;
        nr=x;
        actualizare(1,1,n);
    }

    for(i=1;i<=m;i++)

        {
            fscanf(f,"%d%d%d",&op,&a,&b);
            switch(op)
                {
                    case 0: {day=a;val=b; achitare(); break;}
                    case 1: {s=0; day1=a; day2=b; request(1,1,n); fprintf(g,"%d\n",s) ; break;}
                }
        }

    return 0;
}