Cod sursa(job #2497362)

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


FILE *fin = fopen("aib.in","r"), *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( sum <= s )dr = d;
        else
            st = d+1;
    }

    return st;
}

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));
        }
    }
}