Cod sursa(job #1660772)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 23 martie 2016 13:41:35
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#define zeros(x) ((x^(x-1))&x)

using namespace std;

const int NMAX = 100001;
int A[NMAX];
int n,m;

void citire()
{
   scanf("%d %d",&n,&m);
    int x;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        A[i] = x;
    }
}

int Sum(int x)
{
    int sum = 0;
    for(int i=x;i>0;i--)
        sum+=A[i];
    return sum;
}

int binar(int a)
{
    int x = 1,y=n;
    int m;
    while(x<=y)
    {
        m = (x+y)/2;
        if(Sum(m)==a && Sum(m-1) < a)
            return m;
        else
        {
            if(Sum(m)>=a)
                y = m-1;
            else
                x = m+1;
        }
    }
    return -1;
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    citire();
    int q,a,b;
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&q);
        if(q==0)
        {
            scanf("%d %d",&a,&b);
            A[a]+=b;
            continue;
        }
        if(q==1)
        {
            scanf("%d %d",&a,&b);
            printf("%d\n",Sum(b)-Sum(a-1));
            continue;
        }
        if(q==2)
        {
            scanf("%d",&a);
            printf("%d\n",binar(a));
            continue;
        }
    }
   fclose(stdin);
   fclose(stdout);
    return 0;
}