Cod sursa(job #2071147)

Utilizator AlexTheDagonBogdan Tudor AlexTheDagon Data 20 noiembrie 2017 13:02:39
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#define NM 100005
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n,a[NM],m,c,x,y,pos;
int querysum(int poz)
{
    int suma=0;
    for(int poss=poz;poss>0;poss-=(poss&-poss))suma+=a[poss];
    return suma;
}
int main()
{
    in>>n>>m;
    for(int i=1;i<=n;++i)
    {
        in>>a[i];
        a[i]+=a[i-1];
    }
    for(int i=n;i>0;--i)
        a[i]-=a[i-(i&-i)];
    for(int i=1;i<=m;++i)
    {
        in>>c>>x;
        if(c==0)
        {
            in>>y;
            for(int pos=x;pos<=n;pos+=(pos&-pos))a[pos]+=y;
        }
        if(c==1)
        {
            in>>y;
            out<<querysum(y)-querysum(x-1)<<'\n';
        }
        if(c==2)
        {
            int st=1,dr=n,mid,sol=-1;
            while(st<=dr)
            {
                mid=st+(dr-st)/2;
                if(querysum(mid)==x)sol=mid;
                if(querysum(mid)>=x)dr=mid-1;
                else st=mid+1;
            }
            while(sol>0 && querysum(sol)==x)--sol;
            while(sol<=n && querysum(sol)!=x)++sol;;
            if(sol>n&&querysum(sol)!=x)out<<"-1";
            else out<<sol;
            out<<'\n';
        }
    }
    return 0;
}