Cod sursa(job #1602297)

Utilizator RadduFMI Dinu Radu Raddu Data 16 februarie 2016 18:27:26
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <iostream>
#include <fstream>
#define lim 100000
#define len(x) (x&(-x))
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
 int n,m,aib[150005];

void Update(int x,int val)
{ int i;
   for(i=x;i<=lim;i+=len(i))
    aib[i]+=val;
}

int Query(int x)
{ int i,res=0;
   for(i=x;i>0;i-=len(i))
    res+=aib[i];
  return res;
}

int Search(int sum)
{ int i,act=0,num=0;

    for(i=16;i>=0;i--)
     if (act+aib[num|(1<<i)]<=sum && ((num|(1<<i))<=n))
        { num|=(1<<i);
          act+=aib[num];
        }

  return num;
}

int main()
{ int i,x,y,t;
    f>>n>>m;
    for(i=1;i<=n;i++)
    { f>>x;Update(i,x); }


    for(i=1;i<=m;i++)
    {
        f>>t;
        if (t==0) { f>>x>>y; Update(x,y); }
        if (t==1) { f>>x>>y; g<<Query(y)-Query(x-1)<<"\n"; }
        if (t==2) { f>>x; g<<Search(x)<<"\n"; }
    }
    return 0;
}