Cod sursa(job #2581155)

Utilizator Tudor007Pricop Tudor Tudor007 Data 14 martie 2020 16:40:25
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <bits/stdc++.h>
#define nmax 32768

using namespace std;

FILE *fin=fopen("datorii.in","r");
FILE *fout=fopen("datorii.out","w");

int arbore[nmax],interogari,n;

void afisare()
{
    for(int i=1;i<=2*n+1;i++)
        cout << arbore[i] << " ";
    cout << endl;
}

void update(int nod_curent,int pozitie,int valoare,int st,int dr)
{
    if(st==dr)
    {
        arbore[nod_curent]+=valoare;
    }
    else
    {
        int mijloc=(st+dr)/2;
        if(pozitie<=mijloc)
        {
            update(nod_curent*2,pozitie,valoare,st,mijloc);
        }
        else if(pozitie>mijloc)
        {
            update(nod_curent*2+1,pozitie,valoare,mijloc+1,dr);
        }
        arbore[nod_curent]=arbore[nod_curent*2]+arbore[nod_curent*2+1];
    }
}

int query(int nod_curent,int a,int b,int st,int dr)
{
    if(a<=st&&dr<=b)
    {
        return arbore[nod_curent];
    }
    else
    {
        int mijloc=(st+dr)/2;
        int val1=0,val2=0;
        if(a<=mijloc)
        {
            val1=query(nod_curent*2,a,b,st,mijloc);
        }
        if(b>mijloc)
        {
            val2=query(nod_curent*2+1,a,b,mijloc+1,dr);
        }
        return val1+val2;
    }
}

int main()
{
    int cerinta,element,a,b;
    fscanf(fin,"%d %d",&n,&interogari);
    for(int i=1;i<=n;i++)
    {
        fscanf(fin,"%d",&element);
        update(1,i,element,1,n);
    }
//    afisare();
    for(int i=1;i<=interogari;i++)
    {
        fscanf(fin,"%d %d %d",&cerinta,&a,&b);
        if(cerinta==0)
        {
            b=-b;
            update(1,a,b,1,n);
//            afisare();
        }
        else
        {
            element=query(1,a,b,1,n);
            fprintf(fout,"%d\n",element);
        }
    }


    fclose(fin);
    fclose(fout);
    return 0;
}