Cod sursa(job #1367075)

Utilizator andi12Draghici Andrei andi12 Data 1 martie 2015 16:27:33
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>

using namespace std;
const int N=100005;
int aib[N],n;
void update(int poz,int val)
{
    while(poz<=n)
    {
        aib[poz]=aib[poz]+val;
        poz+=poz&(-poz);
    }
}
int sum(int poz)
{
    int s=0;
    while(poz>=1)
    {
        s=s+aib[poz];
        poz-=poz&(-poz);
    }
    return s;
}
int cauta(int val)
{
    int pas=1<<16,p=0;
    while(pas>n)
        pas=pas/2;
    while(pas>0)
    {
        if(aib[p+pas]<=val && aib[p+pas]!=0)
        {
            p=p+pas;
            val=val-aib[p];
        }
        pas=pas/2;
    }
    if(val==0)
        return p;
    else
        return -1;
}
int main()
{
    FILE *in,*out;
    in=fopen("aib.in","r");
    out=fopen("aib.out","w");
    int m,i,j,val,c,a,b,ras;
    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%d",&c,&a);
        if(c==0)
        {
            fscanf(in,"%d",&val);
            update(a,val);
        }
        if(c==1)
        {
            fscanf(in,"%d",&b);
            ras=sum(b)-sum(a-1);
            fprintf(out,"%d\n",ras);
        }
        if(c==2)
        {
            ras=cauta(a);
            fprintf(out,"%d\n",ras);
        }
    }
    return 0;
}