Cod sursa(job #2701453)

Utilizator Iulia_DianaIulia Diana Iulia_Diana Data 31 ianuarie 2021 12:34:02
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int arb[200005], val[100005];
void build(int st, int dr, int nod)
{
    if(st==dr)
    {
        arb[nod]=val[st];
    }
    else
    {
        int mij=(st+dr)/2;
        build(st, mij, nod*2);
        build(mij+1, dr, nod*2+1);
        arb[nod]=arb[nod*2]+arb[nod*2+1];
    }
}
void update(int st, int dr, int ind, int vall, int nod)
{
    if(st==dr)
    {
        val[ind]+=vall;
        arb[nod]+=vall;
    }
    else
    {
        int mij=(st+dr)/2;
        if(ind<=mij)  update(st, mij, ind, vall, nod*2);
        else  update(mij+1, dr, ind, vall, nod*2+1);
        arb[nod]=arb[nod*2]+arb[nod*2+1];
    }
}
int query(int st, int dr, int i, int f, int nod)
{
    if(dr<i || f<st)   return 0;
    if(st>=i && dr<=f)   return arb[nod];
    int mij=(st+dr)/2, rez1, rez2;
    rez1=query(st, mij, i, f, nod*2);
    rez2=query(mij+1, dr, i, f, nod*2+1);
    return rez1+rez2;
}
int main()
{
    int n, m; fin >> n >> m;
    for(int i=1; i<=n; i++)  fin >> val[i];
    build(1, n, 1);
    for(int i=1; i<=m; i++)
    {
        int tip; fin >> tip;
        if(tip==0)
        {
            int a, b; fin >> a >> b;
            update(1, n, a, b, 1);
        }
        else
            if(tip==1)
            {
                int a, b; fin >> a >> b;
                fout << query(1, n, a, b, 1) << "\n";
            }
        else
            if(tip==2)
            {
                int a, s=0, j;  fin >> a;
                for(j=1; j<=n && s<a; j++)
                    s+=val[j];
                if(s==a)   fout << j-1 << "\n";
                else  fout << -1 << "\n";
            }
    }
    return 0;
}