Cod sursa(job #2133180)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 16 februarie 2018 17:18:43
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <cmath>
#define MAXN 100001
int aib[MAXN],n;
inline void update(int p,int val)
{
    while(p<=n)
    {
        aib[p]+=val;
        p+=p&(-p);
    }
}
inline int query(int p)
{
    int s=0;
    while(p)
    {
        s+=aib[p];
        p-=p&(-p);
    }
    return s;
}
inline int cbin(int s)
{
    int i=0,pas=log2(n);
    for(pas=1<<pas;pas && s;pas>>=1)
        if(i+pas<=n && aib[i+pas]<=s)
            i+=pas,s-=aib[i];
    if(s)
        return -1;
    return i;
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("aib.in","r");
    fout=fopen("aib.out","w");
    int x,m,tip,y;
    fscanf(fin,"%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        fscanf(fin,"%d",&x);
        update(i+1,x);
    }
    for(int i=0;i<m;i++)
    {
        fscanf(fin,"%d%d",&tip,&x);
        if(tip==2)
            fprintf(fout,"%d\n",cbin(x));
        else
        {
            fscanf(fin,"%d",&y);
            if(tip)
                fprintf(fout,"%d\n",query(y)-query(x-1));
            else
                update(x,y);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}