Cod sursa(job #3326432)

Utilizator octavurlurleteanu alexandru octavian octavurl Data 28 noiembrie 2025 21:13:17
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.27 kb
/*
          _____                            _____                           _______
         /\    \                          /\    \                         /::\    \
        /::\____\                        /::\    \                       /::::\    \
       /:::/    /                       /::::\    \                     /::::::\    \
      /:::/    /                       /::::::\    \                   /::::::::\    \
     /:::/    /                       /:::/\:::\    \                 /:::/~~\:::\    \
    /:::/    /                       /:::/__\:::\    \               /:::/    \:::\    \
   /:::/    /                       /::::\   \:::\    \             /:::/    / \:::\    \
  /:::/    /      _____            /::::::\   \:::\    \           /:::/____/   \:::\____\
 /:::/____/      /\    \          /:::/\:::\   \:::\    \         :::    |     |:::|    |
|:::|    /      /::\____\        /:::/  \:::\   \:::\____\        |:::|____|     |:::|    |
|:::|____\     /:::/    /        \::/    \:::\  /:::/    /         \:::\    \   /:::/    /
 \:::\    \   /:::/    /          \/____/ \:::\/:::/    /           \:::\    \ /:::/    /
  \:::\    \ /:::/    /                    \::::::/    /             \:::\    /:::/    /
   \:::\    /:::/    /                      \::::/    /               \:::\__/:::/    /
    \:::\__/:::/    /                       /:::/    /                 \::::::::/    /
     \::::::::/    /                       /:::/    /                   \::::::/    /
      \::::::/    /                       /:::/    /                     \::::/    /
       \::::/    /                       /:::/    /                       \::/____/
        \::/____/                        \::/    /                         ~~
         ~~                               \/____/
{1}
*/
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ins(x) insert(x)
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define fast_ios ios_base::sync_with_stdio(0),fin.tie(nullptr),fout.tie(nullptr);
#define all(v) (v).begin() , (v).end()

using namespace std;

ifstream fin ( "datorii.in" ) ;
ofstream fout ( "datorii.out" ) ;

int nxt()
{
int x;
fin >> x ;
return x;
}
void close_files()
{
fin.close();
fout.close();
}

class Arbori_de_intervale
{
private:
    vector<int>aint;
    vector<int>v;
    int n;
    void build(int left , int right , int nod )
    {
        if ( left > right )
            return ;
        if ( left == right ){
            aint[nod]=v[left];
            return;
            }
        int mij = ( left + right ) / 2 ;
        build(left,mij,nod*2);
        build(mij+1,right,nod*2+1);
        aint[nod] = aint[nod*2]+aint[nod*2+1];
    }
public:
   Arbori_de_intervale(int x,vector<int>a)
   {
       aint.resize(4*x);
       v=a;
       n = x;
       build(1,n,1);
   }
    void update(int left , int right , int nod , int poz , int val )
    {
    if ( left > right )
        return ;
    if ( left == right )
    {
        if ( left == poz )
            v[left]=val,aint[nod]=val;
        return;
    }
    int mij = ( left + right ) / 2;
    update(left,mij,nod*2,poz,val);
    update(mij+1,right,nod*2+1,poz,val);
    aint[nod]=aint[nod*2]+aint[nod*2+1];
    }
    int query(int left , int right , int nod , int left1 , int right1 )
    {
        if ( right < left1 || left > right1 )
            return 0;
        if ( left1 <= left && right <= right1 )
            return aint[nod];
        if ( left > right )
            return 0;
        int mij = ( left + right ) / 2 ;
        return query(left,mij,nod*2,left1,right1) + query(mij+1,right,nod*2+1,left1,right1);
    }
};


signed main()
{

    int n , q;
    fin >> n >> q;
    vector<int>v(n+1);
    for ( int i = 1 ; i <= n; ++ i )
        fin >> v[i] ;
    Arbori_de_intervale aint(n,v);
    while ( q-- )
    {
    int c;
    fin >> c;
    if ( c == 1 )
    {
      int left , right ;
      fin >> left >> right ;
      fout << aint.query(1,n,1,left,right) << '\n';
    }
    else{
      int val , poz ;
      fin >> poz >> val ;
      if ( v[poz] < val )
        aint.update(1,n,1,poz,0);
      else
        aint.update(1,n,1,poz,v[poz]-val);
    }
    }
    close_files();
    return 0;
}