Cod sursa(job #2867842)

Utilizator NorbiNORBI KOVER Norbi Data 10 martie 2022 16:24:32
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include<bits/stdc++.h>
using namespace std;
FILE *f=fopen("datorii.in","r");
FILE *g=fopen("datorii.out","w");
const int NMAX = 15004;
int N,Q;
int Tree[4*NMAX];/// aici vom retine sumele de intervale
void Build(int nod,int left,int right)
{
    if(left==right)
    {
        fscanf(f,"%d",&Tree[nod]);
        return;
    }

    int mid = left + (right-left)/2;
    Build(2*nod,left,mid);
    Build(2*nod+1,mid+1,right);

    Tree[nod] = Tree[2*nod]+Tree[2*nod+1];
}
void Read()
{
    fscanf(f,"%d%d",&N,&Q);
    Build(1,1,N);
}
int Query(int nod,int left,int right,int x,int y)
{
    /// daca intervalul [left,right] se afla in totalitate in [x,y]
    if(x<=left&&right<=y)
        return Tree[nod];

    int mid = left + (right-left)/2;

    int sum1=0,sum2=0;
    /// daca intervalul [x,y] se intersecteaza cu [left,mid]
    if(x<=mid)
        sum1 = Query(2*nod,left,mid,x,y);
    /// daca intervalul [x,y] se intersecteaza cu [mid+1,right]
    if(y>=mid+1)
        sum2 = Query(2*nod+1,mid+1,right,x,y);
    return sum1+sum2;
}
void Update(int nod,int left,int right,int pos,int val)
{
    /// fiind in intervalul corespunzator daca left==right
    /// stim ca am ajuns la pozitia pos
    if(left==right)
    {
        Tree[nod]-=val;
        if(Tree[nod]<0)Tree[nod]=0;
        return;
    }

    int mid = left + (right-left)/2;

    /// daca pos se afla in intervalul [left,mid]
    if(pos<=mid)
        Update(2*nod,left,mid,pos,val);
    /// altfel daca pos se afla in intervalul [mid+1,right]
    else Update(2*nod+1,mid+1,right,pos,val);

    /// actualizam din nou nodurile afectate de modificari
    Tree[nod] = Tree[2*nod] + Tree[2*nod + 1];
}
void Solve()
{
    for(int q=1;q<=Q;q++)
    {
        int tip,x,y;
        fscanf(f,"%d%d%d",&tip,&x,&y);

        if(tip==1)
            fprintf(g,"%d\n",Query(1,1,N,x,y));
        else Update(1,1,N,x,y);
    }
}
int main()
{
    Read();
    Solve();
    fclose(f);
    fclose(g);
    return 0;
}