Cod sursa(job #1050779)

Utilizator alexpascadiAlexandru Pascadi alexpascadi Data 9 decembrie 2013 09:39:24
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <fstream>

using namespace std;

const int N=100001;
int t[N],n,m;

int search(int sum)
{
    int i=0, pas=1<<17;

    while(pas>0)
    {
         if(i+pas<=n)
         {
            if(sum>=t[i+pas])
            {
                i+=pas;
                sum-=t[i];
                if (sum==0) return i;
            }
         }
         pas>>=1;
    }
    return -1;
}

int query (int p)
{
    int sum=0;
    while(p!=0)
    {
        sum+=t[p];
        p-=p&-p;
    }
    return sum;
}

void update (int p, int val)
{
    while(p<=n)
    {
        t[p]+=val;
        p+=p&-p;
    }
}

int main()
{
    ifstream in("aib.in");
    FILE *out;
    out=fopen("aib.out","w");
    int i,x,a,b;
    in>>n>>m;
    for(i=1;i<=n;i++) t[i]=0;
    for(i=1;i<=n;i++)
    {
        in>>x;
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        in>>x;
        if(x==0)
        {
            in>>a>>b;
            update(a,b);
        }
        if(x==1)
        {
            in>>a>>b;
            fprintf(out,"%d\n",query(b)-query(a-1));
        }
        if(x==2)
        {
            in>>a;
            fprintf(out,"%d\n",search(a));
        }
    }
}