Cod sursa(job #1040626)

Utilizator horobamarcelHoroba Marcel Emanuel horobamarcel Data 24 noiembrie 2013 18:32:07
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>
 
int v[100000],sum,val,p,a,b;
 
void creare(int, int, int);
void actualiz(int,int,int);
void suma(int, int, int);
 
int main()
{
    int l,i,x,m;
    FILE *f,*g;
    f=fopen("datorii.in","r");
    g=fopen("datorii.out","w");
    fscanf(f,"%d%d",&l,&m);
    for(i=1;i<=l;i++){
        fscanf(f,"%d",&x);
        p=i;
        val=x;
        creare(1,1,l);
    }
 
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&x,&a,&b);
        if(x==0){
            p=a;
            val=b;
            actualiz(1,1,l);
        }
        else {
            sum=0;
            suma(1,1,l);
            fprintf(g,"%d\n",sum);
        }
    }
    fclose(f);
    fclose(g);
 
}
 
void creare(int n, int s, int d){
    int m;
    if(s==d){
        v[n]=val;
    }
    else{
        m=(s+d)/2;
        if(p<=m){
            creare(2*n,s,m);
        }
        else creare(2*n+1,m+1,d);
        v[n]=v[2*n]+v[2*n+1];
    }
}
 
void actualiz(int n, int s, int d){
    int m;
    if(s==d){
        v[n]-=val;
    }
    else{
        m=(s+d)/2;
        if(p<=m){
            actualiz(2*n,s,m);
        }
        else actualiz(2*n+1,m+1,d);
        v[n]=v[2*n]+v[2*n+1];
    }
}
 
void suma(int n, int s, int d){
    int m;
    if(a<=s && b>=d){
        sum+=v[n];
    }
    else {
        m=(s+d)/2;
        if(a<=m)
            suma(2*n,s,m);
        if(m+1<=b)
            suma(2*n+1,m+1,d);
    }
}