Cod sursa(job #1650632)

Utilizator Liviu98Dinca Liviu Liviu98 Data 11 martie 2016 19:34:05
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <stdio.h>
#include <cstdio>
#define NMax 100050
using namespace std;
int N,M,AIB[NMax];

inline int zeros(int x)
{
    return (x^(x-1))&x;
}

void Update(int x,int val)
{
    for(int i=x;i<=N;i=i+zeros(i))
        AIB[i]=AIB[i]+val;
}

int Suma(int x)
{
    int suma=0;
    for(int i=x;i>=1;i=i-zeros(i))
        suma=suma+AIB[i];
    return suma;
}

int search(int value)
{
    int step,vals=0, ind = 0;
    for(step=1;step<N;step<<=1);
    for(step;step;step>>=1)
        if (ind+step<=N && vals+AIB[ind+step]<=value)
            vals += AIB[ind+=step];
    return ind;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d",&N,&M);
    for (int i=1;i<=N;i++)
    {
        int x;
        scanf("%d",&x);
        Update(i,x);
    }
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        scanf("%d",&x);
        if (x==0)
        {
            scanf("%d %d",&y,&z);
            Update(y,z);
        }
        else if(x==1)
        {
            scanf("%d %d",&x,&y);
            printf("%d\n",Suma(y)-Suma(x-1));
        }
        else if (x==2)
        {
            scanf("%d",&y);
            int ind=search(y);
            if (ind>=1 && ind<=N && Suma(ind)==y)
                printf("%d\n",ind);
            else
                printf("-1\n");
        }

    }
}