Cod sursa(job #877213)

Utilizator stefanzzzStefan Popa stefanzzz Data 12 februarie 2013 17:58:13
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#define MAXN 15005
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");


int n,m,v[MAXN],ai[4*MAXN],b,a,S;
bool tip;

void build_ai(int nod, int st,int dr);
void update_ai(int nod, int st,int dr);
void suma_ai(int nod,int st,int dr);

int main()
{
    int i;
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>v[i];
    build_ai(1,1,n);
    for(i=1;i<=m;i++){
        f>>tip>>a>>b;
        if(tip){
            S=0;
            suma_ai(1,1,n);
            g<<S<<'\n';}
        else
            update_ai(1,1,n);}
    f.close();
    g.close();
    return 0;
}

void build_ai(int nod, int st,int dr){
    if(st==dr){
        ai[nod]=v[st];
        return;}
    int mij=(st+dr)/2;
    build_ai(2*nod,st,mij);
    build_ai(2*nod+1,mij+1,dr);
    ai[nod]=ai[2*nod]+ai[2*nod+1];}

void update_ai(int nod, int st,int dr){
    if(st==dr){
        ai[nod]-=b;
        return;}
    int mij=(st+dr)/2;
    if(mij>=a)
        update_ai(2*nod,st,mij);
    else
        update_ai(2*nod+1,mij+1,dr);
    ai[nod]=ai[2*nod]+ai[2*nod+1];}

void suma_ai(int nod,int st,int dr){
    if(st>=a&&dr<=b){
        S+=ai[nod];
        return;}
    int mij=(st+dr)/2;
    if(a<=mij)
        suma_ai(2*nod,st,mij);
    if(b>mij)
        suma_ai(2*nod+1,mij+1,dr);}