Cod sursa(job #3160273)

Utilizator danyyyDaniel danyyy Data 23 octombrie 2023 16:38:03
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int N=1<<16;
int aint[N];
int mini=-1;
void construire(int p,int st,int dr)
{
    if(st==dr)
    {
        fin>>aint[p];
    }
    else
    {
        int mij=(dr+st)/2,fs=2*p,fd=2*p+1;
        construire(fs,st,mij);
        construire(fd,mij+1,dr);
        aint[p]=aint[fs]+aint[fd];
    }
}
void inlocuire(int p,int st,int dr,int a,int b)
{
    if(st==dr)
    {
        aint[p]=aint[p]-b;
    }
    else
    {
        int mij=(st+dr)/2,fs=2*p,fd=2*p+1;
        if(a<=mij)
            inlocuire(fs,st,mij,a,b);
        else
        {
            inlocuire(fd,mij+1,dr,a,b);
        }
        aint[p]=aint[fs]+aint[fd];
    }
}
int interogare(int p,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
    {
        return aint[p];
    }
    else
    {
        int mij=(st+dr)/2,fd=2*p+1,fs=2*p;
        int rs=0,rd=0;
        if(a<=mij)
            rs=interogare(fs,st,mij,a,b);
        if(b>mij)
        {
            rd=interogare(fd,mij+1,dr,a,b);
        }
        return rs+rd;
    }

}
int main()
{
    int n,m;
    fin>>n>>m;
    construire(1,1,n);
    for(int i=1; i<=m; i++)
    {
        int tip,a,b;
        fin>>tip>>a>>b;
        if(tip==1)
        {
            fout<<interogare(1,1,n,a,b)<<'\n';
        }
        else
        {
            inlocuire(1,1,n,a,b);
        }
    }
}