Cod sursa(job #3186021)

Utilizator aeandreescuAndreescu Ana-Eliza aeandreescu Data 21 decembrie 2023 01:20:11
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <fstream>

using namespace std;

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

const int nmax= 15000;
const int pmax= 16384;

int arbint[pmax*2+1];

void build( int x, int p ) {
    if ( x<p ) {
        build(x*2, p), build(x*2+1, p);
        arbint[x]= arbint[x*2]+arbint[x*2+1];
    }
}

void update( int x, int y ) {
    arbint[x]= y;
    for ( int i= x/2; i>0; i/= 2 ) {
        arbint[i]= arbint[i*2]+arbint[i*2+1];
    }
}

int query( int k, int a, int b, int x, int y ) {
    if ( x<=a && b<=y ) {
        return arbint[k];
    } else if ( y<a || x>b ) {
        return 0;
    }
    return query(k*2, a, (a+b)/2, x, y)+query(k*2+1, (a+b)/2+1, b, x, y);
}

int main() {
    int n, m, p;
    fin>>n>>m;

    for ( p= pmax; p>=n; p/= 2 ) ; p*= 2;
    for ( int i= 0; i<n; ++i ) {
        fin>>arbint[p+i];
    }
    build(1, p);

    for ( int i= 0, t, x, y; i<m; ++i ) {
        fin>>t>>x>>y;
        if ( t==0 ) {
            update(p+x-1, arbint[p+x-1]-y);
        } else {
            fout<<query(1, p, p*2-1, p+x-1, p+y-1)<<"\n";
        }
    }

    return 0;
}