Cod sursa(job #2497376)

Utilizator vali_27Bojici Valentin vali_27 Data 22 noiembrie 2019 15:45:51
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 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 cauta(int st,int dr,int val)
{
    if(st == dr)
        if(query(st) == val)return st;
        else
            return -1;
    else
    {
        int d = (st + dr)/2;
        int s = query(d);
        if(val <= s)return cauta(1,d,val);
        else
            cauta(d+1,dr,val);
    }

}

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",cauta(1,n,a));
        }
        else
        {
            fscanf(fin,"%d %d",&a,&b);
            if(t == 0)
                update(a,b);
            else
                fprintf(fout,"%d\n",Sum(a,b));
        }
    }
}