Cod sursa(job #931107)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 27 martie 2013 23:39:19
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <iostream>
#include <fstream>
#include <stdio.h>
#define MAXN 100000
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N,M;
int Tree[4*MAXN+5];
int *Vector;
int CreateTree(int k,int left,int right)
{
    if(left==right)
    {
        Tree[k]=Vector[left];
        return Tree[k];
    }
    int m=(left+right)/2;
    int nr1,nr2;
    nr1=CreateTree(2*k,left,m);
    nr2=CreateTree(2*k+1,m+1,right);
    Tree[k]=nr1+nr2;
    return Tree[k];
}
void Update(int k,int left,int right,int a,int b)
{
    if(left==right)
    {
        Tree[k]+=b;
        return;
    }
    int m=(left+right)/2;
    if(a<=m)
        Update(2*k,left,m,a,b);
    else
        Update(2*k+1,m+1,right,a,b);
    Tree[k]+=b;
}
void Read()
{
    fin>>N>>M;
    int i;
    Vector=new int [N+5];
    for(i=1;i<=N;i++)
    {
        fin>>Vector[i];
    }
    CreateTree(1,1,N);
}
int Query1(int k,int left,int right,int a,int b)
{
    if(a<=left&&right<=b)
    {
        return Tree[k];
    }
    int m=(left+right)/2;
    int nr1=0,nr2=0;
    if(a<=m)
        nr1=Query1(2*k,left,m,a,b);
    if(b>m)
        nr2=Query1(2*k+1,m+1,right,a,b);
    return nr1+nr2;
}
int Query2(int k,int left,int right,int a,int &s)
{
    if(s+Tree[k]<=a)
    {
        s+=Tree[k];
        return right;
    }
    if(left==right)
    {
        s+=Tree[k];
        return -1;
    }
    int m=(left+right)/2;
    int nr=-1;
    nr=Query2(2*k,left,m,a,s);
    if(s==a)
        return nr;
//    printf("%d %d %d\n",k,s,a);
    if(s<a)
        return Query2(2*k+1,m+1,right,a,s);
    return -1;
}
void write()
{
    int i;
    for(i=1;i<=15;i++)
        printf("%d %d\n",i,Tree[i]);
}
int main()
{
    Read();
    int i,sw,a,b;
    for(i=1;i<=M;i++)
    {
        fin>>sw;
        if(sw==0)
        {
            fin>>a>>b;
            Update(1,1,N,a,b);
        }
        else if(sw==1)
        {
            fin>>a>>b;
            fout<<Query1(1,1,N,a,b)<<'\n';
        }
        else{
            fin>>a;
            b=0;
            fout<<Query2(1,1,N,a,b)<<'\n';
        }
    }
    fin.close();
    fout.close();
    return 0;
}