Cod sursa(job #2563943)

Utilizator dragossofiaSofia Dragos dragossofia Data 1 martie 2020 16:23:58
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#define Nmax 15000
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n,m,poz,val,qs,qf;
int a[ 4 * Nmax + 66 ],b[Nmax];

void citire()
{
 fin>>n>>m;
 for ( int i = 1 ; i <= n ; i ++ )
        fin>>b[ i ];
}

void creare( int s , int d , int  p )
{
 if( s == d )
       {
        a[ p ] = b[ s ] ;
        return;
       }
  int mid = ( s + d ) / 2;
  creare( s , mid , 2 * p );
  creare( mid + 1 , d , 2 * p + 1 );
  a[ p ] = a[ 2 * p ] + a[ 2 * p + 1];
}

void update( int s , int d  , int p )
{
  if ( s == d )
        {
         a[ p ] -= val ;
         return ;
        }
int mid = ( s + d ) / 2;
if( poz <= mid )
    update( s , mid , 2 * p );
else
    update( mid + 1 , d  , 2 * p + 1 );
a[p] = a[ 2 * p ] + a[ 2 * p + 1 ];
}

int querry ( int s , int d  , int p )
{
  if( qs <= s && d <= qf )
        return a[ p ];
  if( s > qf || d < qs )
        return 0 ;
  int mid = ( s + d ) / 2 ;
  return querry( s , mid , 2 * p) + querry( mid + 1 , d , 2 * p + 1 );

}

int main()
{
    citire();
    creare( 1 , n , 1 );
    int i,task;
    for ( i = 1 ; i <= m ; i++ )
        {
         fin >> task;
         if( task == 1)
            {
             fin>>qs>>qf;
             fout<<querry( 1 , n , 1 )<<"\n";

            }
         else
            {
             fin>>poz>>val;
             update( 1 , n , 1 );
            }
        }
    return 0;
}