Cod sursa(job #1216086)

Utilizator MaarcellKurt Godel Maarcell Data 3 august 2014 11:57:17
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
using namespace std;

int N,M, a[15050], tree[100000],ql,qr,res;

void build(int nod, int l, int r){
    if (l==r){
        tree[nod]=a[l];
        return;
    }

    int mid=(l+r)/2;
    build(nod*2,l,mid);
    build(nod*2+1,mid+1,r);
    tree[nod]=tree[nod*2]+tree[nod*2+1];
}

void query(int nod, int l, int r){
    if (ql<=l && r<=qr){
        res+=tree[nod];
        return;
    }
    if (qr<l || ql>r)
        return;

    int mid=(l+r)/2;
    query(nod*2,l,mid);
    query(nod*2+1,mid+1,r);
}

void scade(int nod, int l, int r){
    if (l==r){
        tree[nod]-=qr;
        return;
    }

    int mid=(l+r)/2;
    if (ql<=mid) scade(nod*2,l,mid);
    else scade(nod*2+1,mid+1,r);
    tree[nod]=tree[nod*2]+tree[nod*2+1];
}
int main(){
    ifstream in("datorii.in");
    ofstream out("datorii.out");
    in >> N >> M;

    int i,op;
    for (i=1; i<=N; i++)
        in >> a[i];
    build(1,1,N);

    for (i=1; i<=M; i++){
        in >> op >> ql >> qr;
        if (op==0)
            scade(1,1,N);
        else{
            res=0;
            query(1,1,N);
            out << res << "\n";
        }
    }

    return 0;
}