Cod sursa(job #1645727)

Utilizator tothalToth Alexandru tothal Data 10 martie 2016 13:28:55
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int x[100005],aib[100005];
int n,m;
void update(int p,int v)
{
    for(int i=p;i<=n;i+=i&(-i))
        aib[i]+=v;
}
int query(int p)
{
    int s=0;
    for(int i=p;i>0;i-=i&(-i))
        s+=aib[i];
    return s;
}
int bin(int val,int L,int R)
{
        if(L<=R)
        {
        int mid=(L+R)/2;
        int s=query(mid);
            if(s==val)
                return mid;
            else
               {
                    if(s>val)
                {
                    bin(val,L,mid-1);
                }
                else
                {
                    bin(val,mid+1,R);
                }
               }
        }
        else
        {
        int mid=(L+R)/2;
        int s=query(mid);
        if(s==val)
            return mid;
        else
            return -1;
        }


}
void citire()
{ fin>>n>>m;
int o,p,v;
    for(int i=1;i<=n;i++)
    {fin>>x[i];
    int z=-i;
   for(int j=0;j<(i&(-i));j++)
            aib[i]=aib[i]+x[i-j];
    }
    for(int i=1;i<=m;i++)
    {
      fin>>o;
      if(o==0)
      {
          fin>>p>>v;
          update(p,v);
      }
      else
      {
          if(o==1)
          {
            fin>>p>>v;
            fout<<query(v)-query(p-1)<<endl;
          }
          else
          {
              fin>>v;
              fout<<bin(v,1,n)<<endl;
          }
      }
    }
}
int main()
{
    citire();
}