Cod sursa(job #1602314)

Utilizator RadduFMI Dinu Radu Raddu Data 16 februarie 2016 18:36:04
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 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[100005];

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 (((num|(1<<i))<=n) && act+aib[num|(1<<i)]<=sum)
        { num|=(1<<i);
          act+=aib[num];
        }
  if (act==sum && num>0) return num;
 return -1;
}

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;
}