Cod sursa(job #2902318)

Utilizator mirceaspPetcu Mircea mirceasp Data 16 mai 2022 00:19:54
Problema Datorii Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <fstream>
#include <cstdio>
#define s 100001
#define arbs 400004
using namespace std;
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[2*nr+1].mx+arb[2*nr+2].mx;
        arb[nr].lower = arb[2*nr+1].lower;
        arb[nr].upper = arb[2*nr+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*2+1) + maxim(i,j,nr*2+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*2+1);
    update(a,b,nr*2+2);
    arb[nr].mx = arb[2*nr+1].mx +arb[2*nr+2].mx;
}
int main()
{
    FILE *f;
    FILE *g;
    g = fopen("datorii.out","w");
    f = fopen("datorii.in","r");
    fscanf(f,"%lld %lld",&n,&m);
    long long i,x;
    for(i = 0;i<n;i++)
    {
        fscanf(f,"%lld",&v[i]);

    }
    long long a,b;
    create_nod(0,n-1,0);
    for(i = 0;i<m;i++)
    {
        fscanf(f,"%lld %lld %lld",&op,&a,&b);
        switch (op) {
            case 1: {
                fprintf(g,"%lld \n",maxim(a-1, b-1,0));
                break;
            }
            case 0: {
                update(a-1, b,0);
                break;
            }
        }
    }
    fclose(f);
    fclose(g);
}