Cod sursa(job #1317113)

Utilizator koroalinAlin Corodescu koroalin Data 14 ianuarie 2015 16:25:21
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 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 cauta(int x);
int main()
{
    int i,q,A,b;
    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);
            fprintf(fout,"%d\n",cauta(A));
            /*gasit=0;
            for (k=1; k<=n; k++)
            {
                x=query(k);
                if(x==A)
                {fprintf(fout,"%d\n",k);
                gasit=1;
                break;}
                if (x>A) break;
            }
            if (!gasit) fprintf(fout,"-1\n");*/
            continue;
        }
    }
    return 0;
}
void citire()
{
    int i,x;
    fscanf(fin,"%d %d",&n,&m);
    for (i=1; i<=n; i++)
        {fscanf(fin,"%d",&x);
        update(i,x);}
}
void update(int poz,int val)
{
    int i;
    for (i=poz; i<=n; i= i+ ( (i^ (i-1) ) & i ))
    s[i]+=val;
}
int query(int p)
{
    int sum=0,i;
    for (i=p; i>0 ; i= i-( (i^ (i-1) ) & i ))
        sum+=s[i];
    return sum;
}
int cauta(int x)
{
    int st=1,dr=n,mijl,val;
    while (st<=dr)
    {
        mijl=(st+dr)/2;
        val=query(mijl);
        if (val==x) return mijl;
        else
        {
            if (val>x) dr=mijl-1;
            else st=mijl+1;
        }
    }
    return -1;
}