Cod sursa(job #1767536)

Utilizator andreigasparoviciAndrei Gasparovici andreigasparovici Data 29 septembrie 2016 14:05:52
Problema Arbori indexati binar Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <stdlib.h>

#define zero(x) ((x^(x-1))&x)

int n,m,s[100010];

void citire();
void rezolvare();


int main()
{
    freopen("aib.in","r",stdin);
    freopen("aib.out","w",stdout);

    citire();
    rezolvare();
    return 0;
}

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

void adauga(int p1,int p2)
{
    int i;
    for(i=p1;i<=n;i+=zero(i))
        s[i]+=p2;
}

int suma(int x)
{
    int t=0,i;
    for(i=x;i>=1;i-=zero(i))
        t+=s[i];
    return t;
}

int interog(int p1,int p2)
{
    return suma(p2)-suma(p1-1);
}

int cautare(int p)
{
    int st=1,dr=n;

    while(st<=dr)
    {
        int m=(st+dr)/2;

        int sum=suma(m);

        if(sum==p)
            return m;
        if(sum>p)
            dr=m-1;
        else
            st=m+1;
    }

    return -1;
}

void rezolvare()
{
    int i;
    for(i=1;i<=m;i++)
    {
        int op,param1,param2;
        scanf("%d ",&op);
        if(!op)
        {
            scanf("%d %d ",&param1,&param2);
            adauga(param1,param2);
        }
        else if(op==1)
        {
            scanf("%d %d ",&param1,&param2);
            printf("%d\n",interog(param1,param2));
        }
        else if(op==2)
        {
            scanf("%d ",&param1);
            printf("%d\n",cautare(param1));
        }
    }
}