Cod sursa(job #2018825)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 6 septembrie 2017 00:14:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <cstdio>
#include <cmath>
#define DIM 355
#define VAL 100005

using namespace std;

struct Bucket
{
    int be, en, nr;
};

Bucket B[DIM];

int N, M, i, j, op, a, b;
int v[VAL], rad, K;

void Update(int a, int b)
{
    int i;
    v[a]+=b;
    for (i=1; i<=K; i++)
      if (B[i].be<=a && a<=B[i].en)
        break;
    B[i].nr+=b;
}

int Sum_Query(int a, int b)
{
    int i, S=0;
    for (i=1; i<=K; i++)
    {
        if (a<=B[i].be && B[i].en<=b)
          S+=B[i].nr;
        else
        {
            if (B[i].be<=a && a<=B[i].en)
            {
                for (j=a; j<=min(b, B[i].en); j++)
                  S+=v[j];
            }
            else
              if (B[i].be<=b && b<=B[i].en)
                for (j=max(a, B[i].be); j<=b; j++)
                  S+=v[j];
        }
    }
    return S;
}

int Position_Query(int a)
{
    int i, j, S=0, P=-1;
    for (i=1; i<=K; i++)
    {
        S+=B[i].nr;
        if (S>=a)
          break;
    }
    S-=B[i].nr;
    for (j=B[i].be; j<=B[i].en; j++)
    {
        S+=v[j];
        if (S==a)
        {
            P=j;
            break;
        }
    }
    return P;
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d %d", &N, &M);
    for (i=1; i<=N; i++)
      scanf("%d", &v[i]);
    rad=sqrt(N);
    i=1;
    while (i<=N)
    {
        B[++K].be=i;
        B[K].en=min(i+rad-1, N);
        for (j=B[K].be; j<=B[K].en; j++)
          B[K].nr+=v[j];
        i+=rad;
    }
    for (i=1; i<=M; i++)
    {
        scanf("%d %d", &op, &a);
        if (op<2)
          scanf("%d", &b);
        if (op==0)
          Update(a, b);
        if (op==1)
          printf("%d\n", Sum_Query(a, b));
        if (op==2)
          printf("%d\n", Position_Query(a));
    }
    return 0;
}