Cod sursa(job #580218)

Utilizator drywaterLazar Vlad drywater Data 12 aprilie 2011 20:35:59
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <stdio.h>
FILE *f=fopen("aib.in","r"),*g=fopen("aib.out","w");
long long i,n,ai[100001],m,a,b,j,x,k,p,sol=0,sum;
int main(void)
{
    fscanf(f,"%lld%lld",&n,&m);
    for (i=1;i<=n;i++)
    {
        fscanf(f,"%lld",&a);
        for (j=i;j<=n;j+=(j^(j-1)&j))
            ai[j]+=a;
    }
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%lld",&x);
        if (x==2)
        {
            fscanf(f,"%lld",&a);
            k=1;
            while (k<=n) k*=2;
            k/=2;
            p=0;
            while (k>=1)
            {
                sum=0;
                for (j=p+k;j>=1;j-=(j^(j-1)&j))
                    sum+=ai[j];
                if (sum==a){sol=p+k; break;}
                if (sum<a)p+=k;
                k/=2;
            }
            if (k==0)
                sol=-1;
            fprintf(g,"%lld\n",sol);
            continue;
        }
        fscanf(f,"%lld%lld",&a,&b);
        if (x==1)
        {
            sum=0;
            for (j=b;j>=1;j-=(j^(j-1)&j))
                sum+=ai[j];
            for (j=a-1;j>=1;j-=(j^(j-1)&j))
                sum-=ai[j];
            fprintf(g,"%lld\n",sum);
            continue;
        }
        for (j=a;j<=n;j+=(j^(j-1)&j))
            ai[j]+=b;
    }
}