Cod sursa(job #3005418)

Utilizator cezarinfoTulceanu Cezar cezarinfo Data 16 martie 2023 23:06:08
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
using namespace std;
FILE*in=fopen("datorii.in","r");
FILE*out=fopen("datorii.out","w");
const int NMAX=15007;
int n,m,i,po=1,x,c,a,b;
int v[4*NMAX],w[NMAX];
void update(int poz,int val,int nod, int nodst, int noddr)
{
    int mij=(nodst+noddr)/2;
    if(nodst==noddr)
    {
        v[nod]=val;
        return;
    }
    if(poz<=mij)
    {
        update(poz,val,2*nod,nodst,mij);
    }
    else if(mij+1<=poz)
    {
        update(poz,val,2*nod+1,mij+1,noddr);
    }
    v[nod]=v[2*nod]+v[2*nod+1];
}
int qer(int st,int dr,int nod,int nodst,int noddr)
{
    if(nodst==st&&noddr==dr)
    {
        return v[nod];
    }
    int mij=(nodst+noddr)/2;
    if(dr<=mij)
    {
        return qer(st,dr,2*nod,nodst,mij);
    }
    if(mij+1<=st)
    {
        return qer(st,dr,2*nod+1,mij+1,noddr);
    }
    return qer(st,mij,2*nod,nodst,mij)+qer(mij+1,dr,2*nod+1,mij+1,noddr);
}
int main()
{
    fscanf(in,"%d%d",&n,&m);
    while(po<n)
    {
        po*=2;
    }
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&x);
        w[i]=x;
        update(i,x,1,1,po);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d%d%d",&c,&a,&b);
        if(c==0)
        {
            update(a,w[a]-b,1,1,po);
        }
        else
        {
            fprintf(out,"%d\n",qer(a,b,1,1,po));
        }
    }
}