Cod sursa(job #1277177)

Utilizator andi12Draghici Andrei andi12 Data 27 noiembrie 2014 12:09:26
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>

using namespace std;
const int N=100000;
int v[N+1],aib[N+1];
int n;
void update(int x,int val)
{
    while(x<=n)
    {
        aib[x]=aib[x]+val;
        x+=x&(-x);
    }
}
int query(int x)
{
    int sum=0;
    while(x>0)
    {
        sum=sum+aib[x];
        x-=x&(-x);
    }
    return sum;
}
int caut(int sum)
{
    int pas=1<<14,x=0;
    while(pas>0)
    {
        if(aib[pas+x]<=sum && aib[pas+x]!=0)
        {
            sum=sum-aib[pas+x];
            x=x+pas;
        }
        pas=pas/2;
    }
    if(sum==0)
        return x;
    else
        return -1;
}
int main()
{
    FILE *in,*out;
    in=fopen("aib.in","r");
    out=fopen("aib.out","w");
    int m,i,j,x,cod,a,b,ras,val,sum;
    fscanf(in,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
        fscanf(in,"%d",&val);
        update(i,val);
    }
    for(i=1;i<=m;i++)
    {
        fscanf(in,"%d",&cod);
        if(cod==0)
        {
            fscanf(in,"%d%d",&a,&b);
            update(a,b);
        }
        if(cod==1)
        {
            fscanf(in,"%d%d",&a,&b);
            sum=query(b)-query(a-1);
            fprintf(out,"%d\n",sum);
        }
        if(cod==2)
        {
            fscanf(in,"%d",&a);
            ras=caut(a);
            fprintf(out,"%d\n",ras);
        }
    }
    return 0;
}