Cod sursa(job #968474)

Utilizator alex_HarryBabalau Alexandru alex_Harry Data 2 iulie 2013 10:31:24
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int Partial[100002],N,M;
void Update(int initial,int value)
{
    int i=initial;
    while(i<=N)
    {
        Partial[i]+=value;
        i+=i&(-i);
    }
}
void Read()
{
    int i;
    f>>N>>M;
    for(i=1;i<=N;i++)
    {
        int value;
        f>>value;
        Update(i,value);
    }
}
int Calculate_Sum_from_1(int a)
{
    int i=a,result=0;
    while(i>0)
    {
        result+=Partial[i];
        i-=i&(-i);
    }
    return result;
}
void Calculate_Sum(int a,int b)
{
    g<<Calculate_Sum_from_1(b)-Calculate_Sum_from_1(a-1)<<"\n";
}
void binary_search(int value)
{
    int st=1,dr=N,mid;
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(Partial[mid]==value)
        {
            g<<mid<<"\n";
            return;
        }
        if(Partial[mid]<value)
            st=mid+1;
        if(Partial[mid]>value)
            dr=mid-1;
    }
    g<<-1<<"\n";
}
void Calculate_Expresions()
{
    int i;
    for(i=1;i<=M;i++)
    {
        int quest,value,pozition,pozition2;
        f>>quest;
        if(quest==0)
        {
            f>>pozition>>value;
            Update(pozition,value);
        }
        if(quest==1)
        {
            f>>pozition>>pozition2;
            Calculate_Sum(pozition,pozition2);
        }
        if(quest==2)
        {
            f>>value;
            binary_search(value);
        }
    }
}
int main()
{
    Read();
    Calculate_Expresions();
    return 0;
}