Cod sursa(job #2256158)

Utilizator YouDontNeedMyNameJurcut Paul YouDontNeedMyName Data 8 octombrie 2018 08:39:55
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("datorii.in");
ofstream out("datorii.out");
int arb[70005],n,q,v[15005];
void actualizare(int st, int dr, int val, int pos, int pos1)
{
    int m=(st+dr)/2;
    arb[pos]+=val;
    if(st==dr)
    {
        return;
    }
    if(pos1<=m)
    {
        actualizare(st,m,val,pos*2,pos1);
    }
    else
        actualizare(m+1,dr,val,2*pos+1,pos1);
}
int solve(int st, int dr, int a, int b, int pos)
{
    if(a<=st && b>=dr)
    {
        return arb[pos];
    }
    int m=(st+dr)/2,v1=0,v2=0;
    if(st>b || dr<a)
        return 0;
    if(a<=m)
    {
        v1=solve(st,m,a,b,pos*2);
    }
    if(b>=m)
    {
        v2=solve(m+1,dr,a,b,pos*2+1);
    }
    return v1+v2;
}
int main()
{
    in >> n >> q;
    for(int i=1; i<=n; i++)
    {
        in >> v[i];
        actualizare(1,n,v[i],1,i);
    }
    for(int i=1; i<=q; i++)
    {
        int a,b,c;
        in >> c >> a >> b;
        if(!c)
        {
            actualizare(1,n,max(-b,-v[a]),1,a);
        }
        else
        {
            out << solve(1,n,a,b,1) << '\n';
        }
    }
    return 0;
}