Cod sursa(job #1968393)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 17 aprilie 2017 17:47:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
const int Nmax=100001;
int aib[Nmax],n,m;
int bit(int x)
{
    return x&(-x);
}
void update(int val,int pos)
{
    for(int i=pos;i<=n;i+=bit(i)) aib[i]+=val;
}
int sum(int poz)
{
    int sum=0;
    for(;poz>=1;poz-=bit(poz)) sum+=aib[poz];
    return sum;
}
int querry(int val)
{
     int step,best;
     for(step=1;step<=n;step<<=1);
     for(best=0;step;step>>=1)
     {
         if(best+step<=n && sum(best+step)<val) best+=step;
     }
     if(sum(best+1)==val) return best+1;
     else return -1;
}
int main()
{
    int i,x,op,a,b;
    fin>>n>>m;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(x,i);
    }
    for(i=1;i<=m;i++)
    {
        fin>>op;
        if(op==0)
        {
            fin>>a>>b;
            update(b,a);
        }
        if(op==1)
        {
            fin>>a>>b;
            fout<<sum(b)-sum(a-1)<<"\n";
        }
        if(op==2)
        {
            fin>>a;
            fout<<querry(a)<<"\n";
        }
    }
}