Cod sursa(job #3222131)

Utilizator cosmin_mihaiDumitru Cosmin cosmin_mihai Data 9 aprilie 2024 09:19:10
Problema Datorii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
//
// Created by Cosmin Dumitru on 09.04.2024.
//
#include <fstream>
using namespace std;

const int N = 15000;
const int L = 17;


int v[N+1], a[1<<(L+1)];

void constructie(int p,int st,int dr){
    if (st==dr){
        a[p] = v[st];
        return;
    }
    int m = (st+dr)/2,fs = 2*p,fd=2*p+1;
    constructie(fs,st,m);//constructie arbore stang;
    constructie(fd,m+1,dr);//cel drept
    a[p] = max(a[fs],a[fd]);
}

void actualizare(int p,int st,int dr,int poz,int val){
    if (st==dr){
        a[p] -= val;
        return;
    }
    int m =(st+dr)/2,fs=2*p,fd=2*p+1;
    if(poz<=m)
        actualizare(fs,st,m,poz,val);
    else
        actualizare(fd,m+1,dr,poz,val);

    a[p] = max(a[fs],a[fd]);
}


int interogare(int x,int st,int dr,int p,int q){
    if (st==dr)
        return a[x];
    //refacem
    int m=(st+dr)/2,fs=2*x,fd=2*x+1;
    int rez_st = 0, rez_dr =0;
    if (p<=m)
        rez_st = interogare(fs,st,m,p,q);
    if(m+1<=q)
        rez_dr = interogare(fd,m+1,dr,p,q);

    return rez_st+rez_dr;
}

int main(){
    ifstream fin ("datorii.in");
    ofstream fout ("datorii.out");
    int n,k,tip;
    fin >> n >> k;
    for (int i = 1; i <=n; ++i) {
        fin >> v[i];
    }
    constructie(1,1,n);
    for (int i = 0; i <k; ++i) {
        fin >> tip;
        if (!tip){
            int ziua,val;
            fin >> ziua >> val;
            actualizare(1,1,n,ziua,val);
        }else{
            int p,q;
            fin >> p>>q;
            fout << interogare(1,1,n,p,q)<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}