Nu aveti permisiuni pentru a descarca fisierul grader_test14.ok

Cod sursa(job #2443856)

Utilizator capmareAlexCapmare Alex capmareAlex Data 29 iulie 2019 17:40:19
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
#define NMAX 15005
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
long long A[NMAX];
long long aint[NMAX*4];
int n, m;
void creare(int nod, int l, int r)
{
    if(l == r)aint[nod] = A[l];
    else
    {
        int m = (l + r) >> 1;
        creare( nod * 2, l , m);
        creare( nod*2 + 1, m + 1, r);
        aint[nod]= aint[nod*2]+aint[nod*2+1];
    }
}
long query(int, int , int , int , int);
void update(int , int, int , int , int );
int main()
{
    fin >> n>> m;
    for( int i = 1; i <= n; ++i)
    {
        fin >>A [i];
    }
    creare(1 ,1 ,n);
    for( int i = 1; i <= m; ++i)
    {
        int c, a, b;
        fin >> c >> a >> b;
        if( c == 0)
        {
            update(1,1,n,a, b);
        }
        else
        {
            fout<<query(1, 1, n, a, b)<<"\n";
        }
    }

    return 0;
}
void update( int nod, int l, int r, int poz, int value)
{
    if(l == r) aint[nod] -= value;
    else
    {
         int m = (l + r) >> 1;
         if(poz <= m) update(nod*2, l , m, poz, value);
         else update(nod*2+1, m+1, r, poz, value);
         aint[nod] = aint[nod*2]+aint[nod*2+1];
    }
}
long query(int nod, int l, int r, int a, int b)
{
    if(a <= l &&  b>= r) return aint[nod];
    else
    {
        int m = (l + r) >> 1;
        int ans=0;
        if(a<=m)
            ans= query(nod*2,l,m,a,b);
        if(m+1 <= b)
            ans+= query(nod*2+1,m+1,r,a,b);
        return ans;
    }
}