Cod sursa(job #1097956)

Utilizator andreeainfo_dAndreea Dutulescu andreeainfo_d Data 4 februarie 2014 11:48:14
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#define LSB(x) ((-x)&x)
using namespace std;

int x,N,M,i,aib[100005],t,a,b;
void Update(int V,int Pos)
{
    int i;
    for(i=Pos;i<=N;i=i+LSB(i))
            aib[i]=aib[i]-V;
}
void Update1(int V,int Pos)
{
    int i;
    for(i=Pos;i<=N;i=i+LSB(i))
            aib[i]=aib[i]+V;
}
int Suma(int Pos)
{
    int i,s=0;
    for(i=Pos; i>0; i-=LSB(i))
            s=s+aib[i];
    return s;
}

int query(int P1,int P2)
{
    return (Suma(P2)-Suma(P1-1));
}


int verific_binar(int a)
{
    int m,p,u;
    p=1;
    u=N;
    while (p<=u)
        {
             m=(p+u)/2;
             if (Suma(m)==a) return m;
             else
             if (Suma(m)<a)
                {
                    if (Suma(m+1)>a) return -1;
                    else
                        p=m+1;
                }
            else
            {
                if(Suma(m-1)<a) return -1;
                else u=m-1;
            }
        }
    return -1;
}

int main()
{
    freopen("arbori.in","r",stdin);
    freopen("arbori.out","w",stdout);
    scanf("%d%d",&N,&M);
    for( i = 1; i <= N; i++ )
    {
        scanf("%d",&x);
        Update1(x,i);
    }
    while(M>0)
    {
        M--;
        scanf("%d",&t);
        if ( t==0 )
        {
                scanf("%d%d\n",&a,&b);
                Update( b, a );
        }
        else
        if (t==1)
        {
                scanf("%d%d\n",&a,&b);
                printf("%d\n",query(a,b));
        }
        else
        {
                scanf("%d\n",&a);
                printf("%d\n",verific_binar(a));
        }
    }
    return 0;
}