Cod sursa(job #3252298)

Utilizator Ana_22Ana Petcu Ana_22 Data 29 octombrie 2024 10:08:15
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <fstream>
#define NMAX 20000
#define BCKT 128

using namespace std;

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

int a[NMAX];
int batog[BCKT];
int n;

void update( int poz, int val ) {
    a[poz] += val;
    batog[poz/BCKT] += val;
}

int query( int st, int dr ) {
    int intleft = st / BCKT + 1, intright = dr / BCKT; // primul in exterior
    if( st % BCKT == 0 ) // e inc de bucket
        intleft--; // consideram si bucketul in care se afla
    if( ( dr + 1 ) % BCKT == 0 ) // e final de bucket
        intright++; // consideram si bucketul in care se afla
    
    int sum = 0;
    while( st < intleft * BCKT ) {
        sum += a[st];
        st++;
    }
    for( int i = intright * BCKT + BCKT - 1; i > dr; i-- )
        sum -= a[i];
    for( ; intleft <= intright; intleft++ )
        sum += batog[intleft];
    return sum;
}

int main() {
    int m, type, t, val, l, r;
    fin >> n >> m;
    for( int i = 0; i < n; i++ ) {
        fin >> a[i];
        batog[i/BCKT] += a[i];
    }
    for( ; m; m-- ) {
        fin >> type;
        if( type == 0 ) {
            fin >> t >> val;
            update( t - 1, -val );
        }
        else {
            fin >> l >> r;
            fout << query( l - 1, r - 1 ) << '\n';
        }
    }
    return 0;
}