Cod sursa(job #3327632)

Utilizator marap2011Paun Mara marap2011 Data 4 decembrie 2025 17:28:10
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("datorii.in") ;
ofstream fout ("datorii.out") ;
int sol ;
int a[400001] , v[100001] ;
void build ( int poz , int st , int dr )
{
    if ( st == dr )
        a[poz] = v[st] ;
    else
    {
        int mid = ( st + dr ) / 2 ;
        build ( poz * 2 , st , mid ) ;
        build ( poz * 2 + 1 , mid + 1 , dr ) ;
        a[poz] = a[poz*2] + a[poz*2+1] ;
    }
}
void query ( int poz , int st , int dr , int qa , int qb )
{
    if ( st >= qa && dr <= qb )
        sol += a[poz] ;
    else
    {
        int mid = ( st + dr ) / 2 ;
        if ( qa <= mid )
            query ( poz * 2 , st , mid , qa , qb ) ;
        if ( qb > mid )
            query ( 2 * poz + 1 , mid + 1 , dr , qa , qb ) ;
    }
}
void update ( int nod , int st , int dr , int poz , int val )
{
    if ( st == dr )
        a[nod] -= val ;
    else
    {
        int mid = ( st + dr ) / 2 ;
        if ( poz <= mid )
            update ( nod * 2 , st , mid , poz , val ) ;
        if ( poz > mid )
            update ( 2 * nod + 1 , mid + 1 , dr , poz , val ) ;
        a[nod] = a[nod*2] + a[nod*2+1] ;
    }
}
int main()
{
    int n , q ;
    fin >> n >> q ;
    for ( int i = 1 ; i <= n ; i ++ )
        fin >> v[i] ;
    build ( 1 , 1 , n ) ;
    for ( int i = 1 ; i <= q ; i ++ )
    {
        int x , y , c ;
        fin >> c >> x >> y ;
        if ( c == 1 )
        {
            sol = 0 ;
            query ( 1 , 1 , n , x , y ) ;
            fout << sol << '\n' ;
        }
        else
            update ( 1 , 1 , n , x , y ) ;
    }

    return 0;
}