Cod sursa(job #1638801)

Utilizator TrascaAndreiTrasca Andrei TrascaAndrei Data 8 martie 2016 09:20:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <stdio.h>
#define zeros(x) (x&(-x))

using namespace std;

const int N = 100001;

int n,m,aib[N];

void update(int i,int val)
{
    for(i;i<=n;i+=zeros(i))
        aib[i]+=val;
}

int querry(int i)
{
    int s=0;
    for(i;i>0;i-=zeros(i))
        s+=aib[i];
    return s;
}

int bin_search(int st,int dr,int x)
{
    if(st>=dr)
        if(querry(st)!=x)
            return -1;
        else
            return dr;
    int mij=(st+dr)/2,k=querry(mij);
    if(k==x)
        return mij;
    if(k<x)
        return bin_search(mij+1,dr,x);
    return bin_search(st,mij,x);
}

int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i,x;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        update(i,x);
    }
    for(i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d",&a);
        if(a==0)
        {
            scanf("%d %d",&b,&c);
            update(b,c);
        }
        else
            if(a==1)
            {
                scanf("%d %d",&b,&c);
                printf("%d\n",(querry(c)-querry(b-1)));
            }
            else
                if(a==2)
                {
                    scanf("%d",&b);
                    printf("%d\n",bin_search(1,n,b));
                }
    }
    return 0;
}