Cod sursa(job #1510862)

Utilizator serbanSlincu Serban serban Data 25 octombrie 2015 18:12:48
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <bits/stdc++.h>

using namespace std;

int v[100000];
int a, b;

void update(int where, int st, int dr) {
    if(st == dr) {
        v[where] = b;
        return ;
    }
    int mij = (dr - st) / 2 + st;
    if(a <= mij)
        update(where * 2, st, mij);
    else update(where * 2 + 1, mij + 1, dr);
    v[where] = v[where * 2] + v[where * 2 + 1];
}

void update2(int where, int st, int dr) {
    if(st == dr) {
        v[where] -= b;
        return ;
    }
    int mij = (dr - st) / 2 + st;
    if(a <= mij)
        update2(where * 2, st, mij), v[where] -= b;
    else update2(where * 2 + 1, mij + 1, dr), v[where] -= b;
}

int calc(int where, int st, int dr) {
    if(a <= st && dr <= b) {
        return v[where];
    }
    int mij = (dr - st) / 2 + st;
    int s = 0;
    if(a <= mij)
        s += calc(where * 2, st, mij);
    if(b > mij)
        s += calc(where * 2 + 1, mij + 1, dr);
    return s;
}

int main()
{
    FILE *f = fopen("datorii.in", "r");
    FILE *g = fopen("datorii.out", "w");

    int n, m, tip;
    fscanf(f, "%d %d", &n, &m);
    for(int i = 1; i <= n; i ++) {
        fscanf(f, "%d", &b);
        a = i;
        update(1, 1, n);
    }

    for(int i = 1; i <= m; i ++) {
        fscanf(f, "%d %d %d", &tip, &a, &b);
        if(tip) {
            fprintf(g, "%d\n", calc(1, 1, n));
        }
        else {
            update2(1, 1, n);
        }
    }
    return 0;
}