Cod sursa(job #1128418)

Utilizator robert_stefanRobert Stefan robert_stefan Data 27 februarie 2014 17:00:05
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <iostream>
#include <fstream>
#define IN "aib.in"
#define OUT "aib.out"
#define NMAX 100005

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int n, m, aib[4*NMAX], suma;

/*inline void creare(int nod, int st, int dr)
{
    if(st==dr)
        aib[nod]=v[st];
    else{
        int mijl=(st+dr)/2;
        creare(2*nod, st, mijl);
        creare(2*nod+1, mijl+1, dr);
        aib[nod]=aib[2*nod]+aib[2*nod+1];
    }
}*/

inline void actualizare(int nod, int st, int dr, int a, int b)
{
    if(st==dr)
        aib[nod]+=b;
    else
    {
        int mijl=(st+dr)/2;
        if(a<=mijl)
            actualizare(2*nod, st, mijl, a, b);
        else
            actualizare(2*nod+1, mijl+1, dr, a, b);
        aib[nod]=aib[2*nod]+aib[2*nod+1];
    }
}

inline void calcsuma(int nod, int st, int dr, int a, int b)
{
    if(a<=st && b>=dr)
        suma+=aib[nod];
    else
    {
        int mijl=(st+dr)/2;
        if(a<=mijl)
            calcsuma(2*nod, st, mijl, a, b);
        if(b>mijl)
            calcsuma(2*nod+1, mijl+1, dr, a, b);
    }
}

inline int cauta(int sum)
{
    int st=1, dr=n, mijl;
    while(st<=dr)
    {
        mijl=(st+dr)/2;
        suma=0;
        calcsuma(1, 1, n, 1, mijl);
        //out<<st<<' '<<mijl<<' '<<dr<<'\n';
        //out<<suma<<' '<<sum<<'\n';
        if(suma==sum)
            return mijl;
        if(suma>sum)
            dr=mijl-1;
        else
            st=mijl+1;
    }
    return -1;
}

int main()
{
    int i, cod, a, b, val;
    in>>n>>m;
    for(i=1; i<=n; ++i)
        //in>>v[i];
        in>>val,
        actualizare(1, 1, n, i, val);
    //creare(1, 1, n);
    while(m--)
    {
        in>>cod;
        if(cod==0)
        {
            in>>a>>b;
            actualizare(1, 1, n, a, b);
        }
        else if(cod==1)
        {
            suma=0;
            in>>a>>b;
            calcsuma(1, 1, n, a, b);
            out<<suma<<'\n';
        }
        else
        {
            in>>a;
            out<<cauta(a)<<'\n';
        }
    }
    in.close();
    out.close();
    return 0;
}