Cod sursa(job #2305593)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 20 decembrie 2018 17:13:14
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,a[100002];
void update(int i,int nr)
{
    while(i<=n)
    {
        a[i]+=nr;
        i+=(i&(-i));
    }
}
int q(int i)
{
    int s=0;
    while(i)
    {
        s+=a[i];
        i-=(i&(-i));
    }
    return s;
}
int src(int nr)
{
    int pas=1<<17,r=0,nrr=nr;
    while(pas)
    {
        if(r+pas<=n&&a[r+pas]<nr)
        {
            r+=pas;
            nr-=a[r];
        }
        pas>>=1;
    }
    if(q(r+1)!=nrr)
        return -1;
    return r+1;
}
int main()
{
    int m,i,j,nr;
    in>>n>>m;
    for(i=1;i<=n;i++)
    {
        in>>nr;
        update(i,nr);
    }
    while(m--)
    {
        in>>nr>>i;
        if(nr==0)
        {
            in>>j;
            update(i,j);
        }
        else if(nr==1)
        {
            in>>j;
            out<<q(j)-q(i-1)<<"\n";
        }
        else
            out<<src(i)<<"\n";
    }
    return 0;	
}