Cod sursa(job #855186)

Utilizator RamaStanciu Mara Rama Data 14 ianuarie 2013 19:09:46
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
using namespace std;
int A[3*15000],n,m,poz,nr,day1,day2,s;

int suma(int a,int b)
{
    return a+b;
}
int request(int nod,int st,int dr)
{
    int s=0;
    int mid;
    if((day1<=st) && (day2>=dr))
    {
        return A[nod];
    }
    mid=(st+dr)/2;
    if(day1<=mid) s=s+request(2*nod,st,mid);
    if(mid<day2) s=s+request(2*nod+1,mid+1,dr);
    return s;
}
//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]=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++)

        {
            nr=0;
            fscanf(f,"%d%d%d",&op,&a,&b);
            switch(op)
                {
                    case 0: {poz=a;nr=(-1)*b; actualizare(1,1,n); break;}
                    case 1: {day1=a; day2=b; fprintf(g,"%d\n",request(1,1,n)); ; break;}
                }
        }

    return 0;
}