Cod sursa(job #3134162)

Utilizator modreanumModreanu Maria modreanum Data 28 mai 2023 17:18:57
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

vector<int> v(15000),arbore(60000);

void construct(int nod,int start,int end)
{int mij;
    if(start==end)
    {
        arbore[nod]=v[start];
        return;
    }

    mij=(start+end)/2;
    construct(2*nod,start,mij);
    construct(2*nod+1,mij+1,end);

    arbore[nod]=arbore[2*nod+1]+arbore[2*nod];
}

int afisare(int nod,int start,int end,int st,int dr)
{
    int mij,sumaSt,sumaDr;
    if (end<st||dr<start)
        return 0;
    if(start>=st&&end <= dr)
        return arbore[nod];

    mij=(start + end)/2;
    sumaSt=afisare(2*nod,start,mij,st,dr);
    sumaDr=afisare(2*nod+1,mij+1,end,st,dr);
    return sumaSt+sumaDr;
}
void plata(int nod,int start,int end,int zi,int nr)
{
    if(start==end)
    {v[zi]-=nr;
        arbore[nod]-=nr;
        return;}
    int mij=(start+end)/2;
    if(zi<=mij)
        plata(2*nod,start,mij,zi,nr);
    else
        plata(2*nod+1, mij+1,end,zi,nr);
    arbore[nod]=arbore[2*nod]+arbore[2*nod + 1];
}
int main()
{
    int N,M,i,c,x,y;
    fin>>N>>M;
    for(i=1;i<= N;i++)
    {fin>>v[i];}
construct(1,1,N);
    for (i=1;i<=M;i++)
    {fin>>c>>x>>y;
        if(c == 1)
            fout<<afisare(1,1,N,x,y)<< '\n';
        else
            plata(1,1,N,x,y);}

    fin.close();
    fout.close();

    return 0;
}