Cod sursa(job #208218)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 14 septembrie 2008 22:18:25
Problema Datorii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<stdio.h>
#define Nmax 15005

FILE *fin=fopen("datorii.in","r"),
    *fout=fopen("datorii.out","w");

int N,K,a[Nmax],M[4*Nmax],ok;


void generare(int nod,int b,int e){

    if(b==e){
        M[nod]=a[e];

    }
    else{
        generare(2*nod,b,(b+e)/2);
        generare(2*nod+1,(b+e)/2+1,e);


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

void modificare(int nod,int b,int e, int poz,int nr){
    if(poz>e || poz<b)
        return;
    if(b==e&&b==poz)
            M[nod]-=nr,ok=1;

    else{
        modificare(2*nod,b,(b+e)/2,poz,nr);
        if(ok==1){
            M[nod]-=nr;
            return;
        }
        modificare(2*nod+1,(b+e)/2+1,e,poz,nr);
        M[nod]-=nr;
    }
}

int rezolvare(int nod,int b,int e,int i,int j){

    if(i>e || j<b)
        return -1;
    if(i<=b && j>=e)
        return M[nod];

    int p1=rezolvare(2*nod,b,(b+e)/2,i,j);
    int p2=rezolvare(2*nod+1,(b+e)/2+1,e,i,j);

    if(p2==-1)
        return p1;
    if(p1==-1)
        return p2;
    return p1+p2;
}

int main(){
    fscanf(fin,"%d %d",&N,&K);
    for(int i=1;i<=N;i++)
        fscanf(fin,"%d",&a[i]);

    generare(1,1,N);
/*
    modificare(1,1,N,3,1);

    for(int i=1;i<=12;i++)
        fprintf(fout,"%d ",M[i]);
*/


    for(int k=1;k<=K;k++){
        int c,i,j;
        fscanf(fin,"%d%d%d",&c,&i,&j);
        ok=0;
        if(c==0)
            modificare(1,1,N,i,j);
        else
            fprintf(fout,"%d\n",rezolvare(1,1,N,i,j));
    }

    fclose(fin);
    fclose(fout);
    return 0;
}