Cod sursa(job #2031669)

Utilizator MarinPeptenaruMarin Vasile Peptenaru MarinPeptenaru Data 3 octombrie 2017 17:52:04
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int v[100002];
int s[100002];
int n,a,b,m,c;
int arbore[400002];
int k;
const int nu_am_gasit=999999;
void build (int nod, int st, int dr)
{
    if(st==dr) arbore[nod]=v[st];
    else if(st<dr)
    {
        int m=(st+dr)/2;
        int nod1=nod*2;
        int nod2=2*nod+1;
        build(nod1,st,m);
        build(nod2,m+1,dr);
        arbore[nod]=arbore[nod1]+arbore[nod2];
    }
}
void op0 (int nod, int poz, int val, int st, int dr)
{
    if(st==dr) arbore[nod]+=val;
    else if(st<dr)
    {
        int m=(st+dr)/2;
        int nod1=2*nod;
        int nod2=2*nod+1;
        if(poz<=m) op0(nod1,poz,val,st,m);
        else op0(nod2,poz,val,m+1,dr);
        arbore[nod]=arbore[nod1]+arbore[nod2];
    }

}
int op1 (int nod, int a, int b, int st, int dr)
{
    if(a==st && b==dr) return arbore[nod];
    else
    {
        int m=(st+dr)/2;
        int nod1=nod*2;
        int nod2=2*nod+1;
        if(a<=m)
        {
            if(b<=m)
                return op1(nod1,a,b,st,m);
            else
            {
                return (op1(nod1,a,m,st,m) + op1(nod2,m+1,b,m+1,dr));
            }
        }
        else
            return op1(nod2,a,b,m+1,dr);
    }
}
void op2 (int sum, int st, int dr)
{
    if(st==dr)
    {
        if(sum==s[st])
            k=min(k,st);
    }
    else if(st<dr)
    {
        int m=(st+dr)/2;
        op2(sum,st,m);
        op2(sum,m+1,dr);
    }
}
int main()
{
    in>>n>>m;
    for(int i=1; i<=n; i++)
    {
        in>>v[i];
        s[i]=v[i]+s[i-1];
    }
    build(1,1,n);
    cout<<s[8]<<'\n';
    for(;m;m--)
    {
        in>>c;
        switch(c)
        {
            case 0:
            in>>a>>b;
            op0(1,a,b,1,n);
            break;
            case 1:
            in>>a>>b;
            out<<op1(1,a,b,1,n)<<'\n';
            break;
            case 2:
            in>>a;
            k=nu_am_gasit;
            op2(a,1,n);
            if(k==nu_am_gasit) k=-1;
            out<<k<<'\n';
            break;
        }
    }
    return 0;
}