Cod sursa(job #931126)

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