Cod sursa(job #2803707)

Utilizator lucriLuchian Cristian lucri Data 20 noiembrie 2021 12:56:55
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int n,m,v,a[100010][25],x,y,z;
int construire(int b,int e,int niv,int q)
{
    if(b>e||q>n)
        return 0;
    if(b==e)
    {
        in>>v;
        a[q][niv]=v;
        return a[q][niv];
    }
    a[q][niv]=construire(b,e-(e-b+1)/2,niv+1,b)+construire(e-(e-b+1)/2+1,e,niv+1,e-(e-b+1)/2+1);
    return a[q][niv];
}
int modificare(int poz,int b,int e,int niv,int q)
{
    if(b==e)
    {
        a[q][niv]-=z;
        return a[q][niv];
    }
    if(poz>=e-(e-b+1)/2+1)
        a[q][niv]=modificare(poz,e-(e-b+1)/2+1,e,niv+1,e-(e-b+1)/2+1)+a[b][niv+1];
    else
        a[q][niv]=modificare(poz,b,e-(e-b+1)/2,niv+1,b)+a[e-(e-b+1)/2+1][niv+1];
    return a[q][niv];
}
int suma(int bi,int ei,int b,int e,int niv,int q)
{
    if(ei<b||bi>e||q>n)
        return 0;
    if(bi<=b&&ei>=e)
        return a[q][niv];
    return suma(bi,ei,b,e-(e-b+1)/2,niv+1,b)+suma(bi,ei,e-(e-b+1)/2+1,e,niv+1,e-(e-b+1)/2+1);
}
int main()
{
    in>>n>>m;
    construire(1,n,1,1);
    for(int i=1;i<=m;++i)
    {
        in>>x>>y>>z;
        if(x==0)
            modificare(y,1,n,1,1);
        else
            out<<suma(y,z,1,n,1,1)<<'\n';
    }
    return 0;
}