Cod sursa(job #2497365)

Utilizator vali_27Bojici Valentin vali_27 Data 22 noiembrie 2019 15:38:37
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
#define NMAX 100001
using namespace  std;


FILE *fin = fopen("aib.in","r");
FILE *fout = fopen("aib.out","w");

int Bit[NMAX],n,m;

void update(int poz,int val)
{
    for(int x = poz; x <= n; x += (x & -x))
        Bit[x] += val ;
}

int query(int poz)
{
    int s = 0;
    for(int x = poz; x > 0; x -= (x & -x))
        s += Bit[x];

    return s;
}

int Sum(int a,int b)
{
    return query(b)-query(a-1);
}

int poz_minim(int sum)
{
    int st = 1, dr = n,s = 0;
    while(st < dr)
    {
        int d = (st + dr)/2;
        s = query(d);
        if(s == sum)return d;
        else
        if( sum < s )dr = d-1;
        else
            st = d+1;
    }

    return -1;
}

int main()
{
    fscanf(fin,"%d %d",&n,&m);
    for(int i=1;i<=n;++i)
    {
        int x;
        fscanf(fin,"%d",&x);
        update(i,x);
    }
    int t,a,b;
    while(m--)
    {
        fscanf(fin,"%d",&t);
        if(t == 2)
        {
            fscanf(fin,"%d",&a);
            fprintf(fout,"%d\n",poz_minim(a));
        }
        else
        {
            fscanf(fin,"%d %d",&a,&b);
            if(t == 0)
                update(a,b);
            else
                fprintf(fout,"%d\n",Sum(a,b));
        }
    }
}