Cod sursa(job #563823)

Utilizator dicu_dariaDaria Dicu dicu_daria Data 26 martie 2011 09:04:19
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#define zeros(x) ((((x-1)^x)+1)/2)
using namespace std;

ifstream fi("aib.in");
ofstream fo("aib.out");
int aib[100005],n,m;
void add(int i,int val)
{
    for( ;i<=n;i+=zeros(i))
        aib[i]+=val;
}
int Query(int a)
{
    int s=0,i;
    for(i=a;i>=1;i-=zeros(i)) s+=aib[i];
    return s;
}
int minim(int val)
{
    int i,step;
    for(step=1;step<n;step<<=1);
    for(i=0;step;step>>=1)
    if(i+step<=n and Query(i+step)<=val) i+=step;
    if(Query(i)==val)
    return i; else return (-1);
}
int main()
{
    int tip,a,b,i;
    fi>>n>>m;
    for(i=1;i<=n;i++) fi>>a, add(i,a);
    for(i=1;i<=m;i++)
    {
        fi>>tip>>a;
        if(tip<2) fi>>b;
        if(tip==0) add(a,b);
        if(tip==1) fo<<Query(b)-Query(a-1)<<"\n";
        if(tip==2) fo<<minim(a)<<"\n";
    }
    return 0;
}