Cod sursa(job #2419959)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 9 mai 2019 22:13:07
Problema Datorii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 15001;
struct Nod{
    int st,dr,value;
}arb[4*NMAX];
int A[NMAX];
void build(int nod, int st, int dr){
    arb[nod].st = st;
    arb[nod].dr = dr;
    if(st == dr){
        arb[nod].value = A[st];
        return;
    }
    int middle = (st+dr)/2;
    build(2*nod,st,middle);
    build(2*nod+1,middle+1,dr);
    arb[nod].value = (arb[2*nod].value + arb[2*nod+1].value);
}
void update(int nod, int where, int new_value){
    int middle = (arb[nod].st + arb[nod].dr)/2;
    if(arb[nod].st == arb[nod].dr){
        arb[nod].value-=new_value;
        return;
    }
    if(where <= middle)
        update(2*nod, where, new_value);
    else
        update(2*nod+1, where, new_value);
    arb[nod].value = (arb[2*nod].value + arb[2*nod + 1].value);
}
int query(int nod, int st, int dr){
    if(arb[nod].st == st && arb[nod].dr == dr)
        return arb[nod].value;
    int middle = (arb[nod].st + arb[nod].dr)/2;
    if(dr <= middle)
        return query(2*nod, st, dr);
    if(st > middle)
        return query(2*nod + 1, st, dr);
    return query(2*nod, st, middle) + query(2*nod + 1, middle + 1, dr);
}
int main()
{
    FILE *fin, *fout;
    int n,m,tip,x,y,i,j;
    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",&A[i]);
    build(1,1,n);
    for(i=1;i<=m;i++){
        fscanf(fin,"%d %d %d\n",&tip,&x,&y);
        if(tip == 0)
            update(1,x,y);
        else
            fprintf(fout,"%d\n",query(1,x,y));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}