Cod sursa(job #1735695)

Utilizator Lungu007Lungu Ionut Lungu007 Data 30 iulie 2016 17:40:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
using namespace std;

#define NMAX 100001

int aib[NMAX],n,m,p,x,y;

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

inline int lsb(int x)
{
    return (x& (-x));
}

void update(int index,int val)
{
    for(;index<=n;index+=lsb(index))
    {
        //cout << index << " ";
        aib[index]+=val;
    }
}

int read(int index)
{
    int sol = 0;
    for(;index>0;index-=lsb(index))
    {
        sol += aib[index];
    }
    return sol;
}

int bin(int x)
{
    int st=1,dr=n,mij,y;
    while(st<=dr)
    {
        mij = (st+dr)/2;
        y = read(mij);
        if(y == x)
        {
            break;
        }
        else if(y<x)
        {
            st = mij+1;
        }
        else
        {
            dr = mij-1;
        }
    }

    if(st>dr) return -1;
    return mij;
}

int main()
{
    in >> n >> m;
    for(int i=1;i<=n;i++)
    {
        in >> x;
       update(i,x);
    }
    for(int i=0;i<m;i++)
    {
        in >> p;
        if(p==0)
        {
            in >> x >> y;
            update(x,y);
        }
       else if(p==1)
        {

            in >> x >> y;
            out << read(y)-read(x-1) << "\n";
        }
        else if(p==2)
        {
            in >> x;
            out << bin(x) << "\n";
        }
    }

    return 0;
}