Cod sursa(job #1095233)

Utilizator kiralalaChitoraga Dumitru kiralala Data 30 ianuarie 2014 16:25:08
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define NMAX 100005

using namespace std;

FILE* f=freopen("aib.in","r",stdin);
FILE* o=freopen("aib.out","w",stdout);

int n,m;
int v[NMAX];
void Update(int p, int x)
{
    while(p<=n)
    {
        v[p]+=x;
        p+=(p^(p-1))&p;
    }
}

int Sum(int p)
{
    int s=0;
    while(p)
    {
        s+=v[p];
        p=p&(p-1);
    }
    return s;
}

int PosOfSum(int s)
{
    int i,t;
    for(t=1;t<=n;t<<=1);
    for(i=0;t;t>>=1)
        if(i+t<=n&&Sum(i+t)<=s)
            i+=t;
    if(Sum(i)==s) return i;
    return -1;
}

int main()
{
    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,a,b;
        scanf("%d",&x);
        switch(x)
        {
            case 0:
                scanf("%d%d",&a,&b);
                Update(a,b);
            break;
            case 1:
                scanf("%d%d",&a,&b);
                printf("%d\n",Sum(b)-Sum(a-1));
            break;
            case 2:
                scanf("%d",&a);
                printf("%d\n",PosOfSum(a));
            break;
        }
    }

    return 0;
}