Cod sursa(job #642275)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 30 noiembrie 2011 20:53:42
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>

#define NMax 100005

using namespace std;

int N, AIB[NMax];

inline int Z (int X)
{
    return (X&(-X));
}

void Update (int X, int V)
{
    for (int i=X; i<=N; i+=Z (i))
    {
        AIB[i]+=V;
    }
}

int Query (int X)
{
    int S=0;
    for (int i=X; i>0; i-=Z (i))
    {
        S+=AIB[i];
    }
    return S;
}

int Search(int V)
{
    int Step;
    for (Step=1; Step<N; Step<<=1);
    for(int i=0; Step; Step>>=1)
    {
        if (i+Step<=N)
        {
            if(V>=AIB[i+Step])
            {
                i+=Step;
                V-=AIB[i];
                if (V==0)
                {
                    return i;
                }
            }
        }
    }
    return -1;
}

int main()
{
    freopen ("aib.in", "r", stdin);
    freopen ("aib.out", "w", stdout);
    int M;
    scanf ("%d %d", &N, &M);
    for (int i=1; i<=N; ++i)
    {
        int A;
        scanf ("%d", &A);
        Update (i, A);
    }
    for (; M>0; --M)
    {
        int Type, X, Y;
        scanf ("%d %d", &Type, &X);
        if (Type==0)
        {
            scanf ("%d", &Y);
            Update (X, Y);
        }
        if (Type==1)
        {
            scanf ("%d", &Y);
            printf ("%d\n", Query (Y)-Query (X-1));
        }
        if (Type==2)
        {
            printf ("%d\n", Search (X));
        }
    }
    return 0;
}