Cod sursa(job #1301679)

Utilizator bence21Bako Bence bence21 Data 26 decembrie 2014 12:19:02
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.85 kb
#include<fstream>
using namespace std;
int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    unsigned long n,m,i,b,j,h=0,c,d,k,min;
    unsigned long long a,x,e[100001],t[100001];
    bool v=0;
    e[0]=0;
    int p;
    f>>n>>m;
    min=n+1;
    for(i=1;i<=n;i++)
        f>>t[i];
    for(i=1;i<=m;i++)
    {
        f>>p;
        if(p==0)
        {
            f>>a>>b;
            t[a]+=b;
            v=1;
            if(a<min)
                min=a;
        }
        else if(p==1)
        {
            if(v)
            {
                x=0;
                for(j=min;j<=n;j++)
                {
                    x+=t[j];
                    e[j]+=x;
                }
                v=0;
                min=n+1;
            }
            f>>a>>b;
            if(b>h)
            {
                x=e[h];
                while(h<b)
                {
                    x+=t[++h];
                    e[h]=x;
                }
            }
            g<<e[b]-e[a-1]<<"\n";
        }
        else {
            if(v)
            {
                x=0;
                for(j=min;j<=n;j++)
                {
                    x+=t[j];
                    e[j]+=x;
                }
                v=0;
                min=n+1;
            }
            f>>a;
            if(h==0)
            {
                x=0;
                while(x<a&&h<n)
                {
                    x+=t[++h];
                    e[h]=x;
                }
                if(x==a)
                    g<<h<<"\n";
                else g<<"-1\n";
            }
            else
            {
                if(e[h]>=a)
                {
                    c=1;
                    d=h;
                    k=(c+d)/2;
                    bool jo=0;
                    while(c<=d)
                    {
                        if(e[k]==a)
                        {
                            c=d+1;
                            g<<k<<"\n";
                            jo=1;
                        }
                        else if(e[k]<a)
                        {
                            c=k+1;
                            k=(c+d)/2;
                        }
                        else {
                            d=k-1;
                            k=(c+d)/2;
                        }
                    }
                    if(jo==0)
                        g<<"-1\n";
                }
                else {
                    x=e[h];
                    while(x<a&&h<n)
                    {
                        x+=t[++h];
                        e[h]=x;
                    }
                    if(x==a)
                        g<<h<<"\n";
                    else g<<"-1\n";
                }
            }
        }
    }
    f.close();
    g.close();
}