Cod sursa(job #2902316)

Utilizator mirceaspPetcu Mircea mirceasp Data 16 mai 2022 00:13:36
Problema Datorii Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#include <fstream>
#define s 100001
#define arbs 400004
using namespace std;
ifstream f("datorii.in");
ofstream g("datorii.out");
long long n,m,op,v[s];
struct nod{
    long long lower,upper,mx,nr;
};
nod arb[arbs];
void create_nod(long long st,long long dr,long long nr)
{
    if(st == dr) {
        if(nr == 0 || nr != arb[nr].nr)
            arb[nr].mx = v[dr];
        arb[nr].lower = st;
        arb[nr].upper = st;
        arb[nr].nr = nr;
        return;
    }
    else
    {
        long long mij = (st+dr)/2;
        create_nod(st,mij,2*nr+1);
        create_nod(mij+1,dr,2*nr+2);
        arb[nr].mx = arb[(nr<<1)+1].mx+arb[(nr<<1)+2].mx;
        arb[nr].lower = arb[(nr<<1)+1].lower;
        arb[nr].upper = arb[(nr<<1)+2].upper;
        arb[nr].nr = nr;
    }

}
long long maxim(long long i,long long j,long long nr)
{
    if(j<arb[nr].lower || i> arb[nr].upper)
        return 0;
    if(i<= arb[nr].lower && j>= arb[nr].upper)
        return arb[nr].mx;
    return (maxim(i,j,(nr<<1)+1) + maxim(i,j,(nr<<1)+2));

}
void update(long long a,long long b,long long nr) {

    if(a<arb[nr].lower || a>arb[nr].upper)
        return;
    else if(arb[nr].lower == arb[nr].upper)
    {arb[nr].mx -= b;return;}
    update(a,b,(nr<<1)+1);
    update(a,b,(nr<<1)+2);
    arb[nr].mx = arb[(nr<<1)+1].mx +arb[(nr<<1)+2].mx;
}
int main()
{
    f>>n>>m;
    long long i;
    for(i = 0;i<n;i++)
    {
        f>>v[i];

    }
    long long a,b;
    create_nod(0,n-1,0);
    for(i = 0;i<m;i++)
    {
        f>>op>>a>>b;
        switch (op) {
            case 1: {
                g<<maxim(a-1, b-1,0)<<'\n';
                break;
            }
            case 0: {
                update(a-1, b,0);
                break;
            }
        }
    }
    f.close();g.close();
}