Cod sursa(job #1507097)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 21 octombrie 2015 13:07:56
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <cstdio>
#include <cmath>
#define DIM 10000
char buff[DIM];
int poz=0;
 
void citeste(int &numar)
{
     numar = 0;
     while (buff[poz] < '0' || buff[poz] > '9')     
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;     
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
}
int n,m,logn;
int a[100023];
void update(int x,int y)
{
     for(;x<=n;x+=(x&(x^(x-1)))) a[x]+=y;
}
int query(int x)
{
    int s=0;
    for(;x>0;x-=(x&(x^(x-1))))
    {
                              s+=a[x];
    }
    return s;
}
int query2(int s)
{
    int use=logn;
    for(int i=0;use>0;use>>=1)
    {
        if(i+use<=n)
        {
            if(s>=a[i+use])
            {
                i+=use;
                s-=a[i];
                if(s==0)
                {
                    return i;
                }
            }
        }
    }
    return -1;
}
int main()
{
    freopen ("aib.in","r",stdin);
    freopen ("aib.out","w",stdout);
    citeste(n);
    citeste(m); 
    logn=1;
    while(logn<=n)
    {
        logn<<=1;
    }
    logn>>=1;
    for(int i=1;i<=n;i++)
    {
            int nr;
            citeste(nr);
            update(i,nr);
    }
    for(int i=1;i<=m;i++)
    {
            int tip;
            citeste(tip);
            if(tip==0)
            {
                      int x1,x2;
                      citeste(x1);
                      citeste(x2);
                      update(x1,x2);
            }
            else if(tip==1)
            {
                 int x1,x2;
                 citeste(x1);
                 citeste(x2);
                 printf("%d\n",query(x2)-query(x1-1));
            }
            else
            {
                int x1;
                citeste(x1);
                printf("%d\n",query2(x1));
            }
    }
}