Cod sursa(job #1834867)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 25 decembrie 2016 17:36:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>

using namespace std;

int aib[100001];
int n;
int query(int p)
{
    int rez,p2;
    rez=0;
    while(p!=0)
    {
        rez+=aib[p];
        p2=(p&(-p));
        p-=p2;
    }
    return rez;
}
void update(int p,int nr)
{
    int p2;
    while(p<=n)
    {
        aib[p]+=nr;
        p2=(p&(-p));
        p+=p2;
    }
}
int poz(int nr)
{
    int i,j;
    i=0;
    j=1<<16;
    while(j>0)
    {
        if(i+j<=n&&aib[i+j]<=nr)
        {
            i+=j;
            nr-=aib[i];
            if(nr==0)
                return i;
        }
        j/=2;
    }
    return -1;
}
int main()
{
    int m,i,a,b,p;
    FILE*fin,*fout;
    fin=fopen("aib.in","r");
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
    {
      fscanf(fin,"%d",&a);
      update(i,a);
    }
    fout=fopen("aib.out","w");
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d",&p);
        if(p==0)
        {
            fscanf(fin,"%d%d",&a,&b);
            update(a,b);
        }
        if(p==1)
        {
            fscanf(fin,"%d%d",&a,&b);
            fprintf(fout,"%d\n",query(b)-query(a-1));
        }
        if(p==2)
        {
            fscanf(fin,"%d",&a);
            fprintf(fout,"%d\n",poz(a));
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}