Cod sursa(job #2753341)

Utilizator MateiDorian123Nastase Matei MateiDorian123 Data 22 mai 2021 14:47:41
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");

const int nmax = 15005;

int n,m;
int t[nmax * 4];
int v[nmax];

void build(int root, int st, int dr){

    if(st==dr){
        t[root] = v[st];
        return;
    }

    int m = (st + dr) / 2;
    build(root * 2, st, m); /// construim subarborele stang
    build(root * 2 + 1, m + 1, dr); /// construim subarborele drept
    t[root] = t[root * 2] + t[root * 2 + 1];


}

int vmax(int poz, int a, int b, int st, int dr){

    if(st >= a && b >= dr)
        return t[poz];

    int m = (st + dr) / 2, r1 = 0, r2 = 0;

    if(a <= m)
          r1 = vmax(2 * poz, a, b, st, m);
    if(b > m)
          r2 = vmax(2 * poz + 1, a, b, m + 1, dr);

    return r1 + r2;

}


void update(int root, int a, int b, int st, int dr){

    if(st == dr){
        t[root] -= b;
        return;
    }

    int m = (st + dr) / 2;

    if(a <= m)
        update(root * 2, a, b, st, m);
    else
        update(root * 2 + 1, a, b, m + 1, dr);

    t[root] = t[root * 2] + t[root * 2 + 1];


}

void read(){

    fin>>n>>m;

    for(int i = 1; i <= n; i ++)
        fin>>v[i];

    build(1, 1, n);
 //for(int i = 1; i <= 4*n; i ++)
       // cout<<t[i]<<" ";

}

void solve(){

    int task, a, b;

    for(int i = 1; i <= m; i ++){
        fin>>task>>a>>b;

        if(task == 0) update(1, a, b, 1, n);
        else fout<<vmax(1, a, b, 1, n)<<"\n";
    }
   // cout<<"\n";
     //for(int i = 1; i <= 4*n; i ++)
       // cout<<t[i]<<" ";

    fin.close();
    fout.close();
}
int main()
{
    read();
    solve();
    return 0;
}

/// am refolosit cod de la problema arbori de intervale