Cod sursa(job #1378333)

Utilizator valexVochescu Alexandru valex Data 6 martie 2015 11:42:43
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#define nmax 100005
#define inf (1<<30) // sau 0x3f3f3f3f
#define LSB(x) ( (-x)&x )
using namespace std;

int n,m,i,Aib[nmax],tip,a,b,x;

inline void update(int val, int poz)
{
    for (int ii=poz;ii<=n;ii+=LSB(ii))
        Aib[ii]+=val;
}

inline int Suma(int poz)
{
    int suma=0;
    for (int ii=poz;ii>0;ii-=LSB(ii))
        suma+=Aib[ii];
    return suma;
}

inline int suma_interval(int a, int b)
{
    return (Suma(b)-Suma(a-1));
}

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    f>>n>>m;
    for (i=1;i<=n;i++)
    {
        f>>x;
        update(x,i);
    }
    for (i=1;i<=m;i++)
    {
        f>>tip;
        if (tip==0)
        {
            f>>a>>b;
            update(b,a);
        }
        else if (tip==1)
        {
            f>>a>>b;
            g<<suma_interval(a,b)<<"\n";
        }
        else
        {
            f >> a;
            int j = 0, pas = 1 << 16;
            while(pas)
            {
                if(j + pas <= n && Suma(j + pas) < a)
                    j += pas;
                pas /= 2;
            }
            j++;
            if(Suma(j) == a)
                g << j << '\n';
            else
                g << -1 << '\n';
        }
    }
    return 0;
}