Cod sursa(job #1316864)

Utilizator koroalinAlin Corodescu koroalin Data 14 ianuarie 2015 11:35:32
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#define NMAX 100001
using namespace std;
FILE* fin=fopen("aib.in","r");
FILE* fout=fopen("aib.out","w");
int n,m,a[NMAX],s[NMAX];
void citire();
void update(int poz,int val);
int query(int p);
int main()
{
    int i,q,A,b,k,x,gasit;
    citire();
    for (i=1; i<=m; i++)
    {
        fscanf(fin,"%d",&q);
        if (q==0)
        {
            fscanf(fin,"%d %d",&A,&b);
            update(A,b);
            continue;
        }
        if (q==1)
        {
            fscanf(fin,"%d %d",&A,&b);
            fprintf(fout,"%d\n",query(b)-query(A-1));
            continue;
        }
        if (q==2)
        {
            fscanf(fin,"%d",&A);
            gasit=0;
            for (k=1; k<=n; k++)
                if(query(k)==A)
                    {fprintf(fout,"%d\n",k);
                    gasit=1;
                    break;}
            if (!gasit) fprintf(fout,"-1\n");
            continue;
        }
    }
    return 0;
}
void citire()
{
    int i;
    fscanf(fin,"%d %d",&n,&m);
    for (i=1; i<=n; i++)
        fscanf(fin,"%d",&a[i]);
    for (i=1; i<=n; i++)
        update(i,a[i]);
}
void update(int poz,int val)
{
    int i;
    for (i=poz; i<=n; i+=( (i^ (i-1) ) & i ))
    s[i]+=val;
}
int query(int p)
{
    int sum=0,i;
    for (i=p; i; i-=( (i^ (i-1) ) & i ))
        sum+=s[i];
    return sum;
}