Cod sursa(job #2113620)

Utilizator andr3i_kaabAndrei Ciineanu andr3i_kaab Data 24 ianuarie 2018 20:34:34
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int n, m, arbi[100001*4], nr, a, b, cod, s;

void update(int node, int st, int dr, int poz, int val)
{
    int med;

    if (st==dr)
    {
        arbi[node]+=val;
        return;
    }

    med=(st+dr)/2;

    if (poz<=med)
      update (node*2, st, med, poz, val);
    else
      update (node*2+1, med+1, dr, poz, val);

    arbi[node]=arbi[node*2]+arbi[node*2+1];
}

int query(int node, int st, int dr, int x, int y)
{
    int med=(st+dr)/2, r1=0, r2=0;

    if (st>=x && dr<=y)
    {
        return (arbi[node]);
    }

    if (med>=x) r1=query (node*2, st, med, x, y);
    if (med<y) r2=query (node*2+1, med+1, dr, x, y);

    return (r1+r2);

}

int caut(int st, int dr, int S)
{
    int mij=(st+dr)/2;
    int sum=query(1, 1, n, 1, mij);

    if (st==dr)
      if (sum==S)
        return st;
      else
        return -1;

    if (S>sum)
      caut(mij+1, dr, S);
    else
      if (S<sum)
        caut(st, mij, S);
      else
        return mij;
}

int main()
{
    int i, j, a, b;
    f>>n>>m;

    for (i=1; i<=n; i++)
    {
        f>>nr;
        update(1, 1, n, i, nr);
    }

    for (i=1; i<=m; i++)
    {
        f>>cod;

        if (cod==0)
        {
           f>>a>>b;
           update(1, 1, n, a, b);
        }

        if (cod==1)
        {
            f>>a>>b;
            g<<query(1, 1, n, a, b)<<"\n";
        }

        if (cod==2)
        {
            f>>s;
            g<<caut(1, n, s)<<"\n";
        }

    }
    return 0;
}