Cod sursa(job #1472944)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 18 august 2015 10:49:52
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>

const char iname[] = "datorii.in";
const char oname[] = "datorii.out";
const int maxN = 15005;

int n, m, T[4*maxN + 100];
void pay();
int getDatorii();
void read();
void solve();
int main()
{
    freopen(iname, "r", stdin);
    freopen(oname, "w", stdout);
    read();
    solve();
    return 0;
}

void pay(int data, int s, int f, int zi, int val){
    if(s == f){
            if(T[data] == 0)T[data]= val;
            else T[data] -= val;
    }
    else{
        int mij = (s + f) / 2;
        if(zi <= mij) pay(2*data, s, mij, zi, val);
        else    pay(2*data+1, mij+1, f, zi, val);
        T[data] = T[2*data] + T[2*data +1];
    }
}
int getDatorii(int zi, int s, int f, int i, int sf){
    if(i <= s && f <= sf)   return T[zi];
    else{
        int mij = (s + f) / 2, left = 0, right = 0;
        if(i <= mij) left = getDatorii(2*zi, s, mij, i,sf);
        if(mij < sf) right = getDatorii(2*zi+1, mij+1, f, i, sf);
        return left+right;
    }
}

void read(){
    scanf("%d %d\n", &n, &m);
    int readin;
    for(int i = 1; i <= n; ++i){
        scanf("%d", &readin);
        pay(1,1,n,i,readin);
    }
}
void solve(){
    for(int i = 0; i < m; ++i){
        int c, x, y;
        scanf("%d %d %d", &c, &x, &y);
        if(c == 0)  pay(1,1,n,x,y);
        else    printf("%d\n",getDatorii(1, 1, n, x, y));
    }
}