Cod sursa(job #3237768)

Utilizator florinul1Iuhas Florin florinul1 Data 12 iulie 2024 22:17:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
//#include <cstdio>
#include <fstream>
//#include <studio.h>

using namespace std;

//const char in[]={"aib.in"},out[]={"aib.out"};
FILE * in, * out;
const int N=100005;
int v[N],n,m,w[N];

void add(int poz,int val)
{
    for(int i=poz; i<=N; i+=i&-i)
    {
        v[i]+=val;
    }
}

int sum(int poz)
{
    int i,sol=0;
    for(i=poz; i>0; i-=i&-i)
    {
        sol+=v[i];
    }
    return sol;
}

int f(int x)
{
    int st=1,dr=n,mij,y;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        y=sum(mij);
        if(y==x)
        {
            if(w[mij]==0)
            {
                while(w[mij]==0)mij--;
                return mij+1;
            }
            return mij;
        }
        if(x<y)dr=mij-1;
        else st=mij+1;
    }
    return -1;
}

int main()
{
    in = fopen("aib.in","r");
    out = fopen("aib.out","w+");
    int i,j,x,y,z;
    fscanf(in,"%d",&n);
    fscanf(in,"%d",&m);
    for(i=1; i<=n; i++)
    {
        fscanf(in,"%d",&w[i]);
        add(i,w[i]);
    }
    for(i=0; i<m; i++)
    {
        fscanf(in,"%d",&x);
        if(x==0)
        {
            fscanf(in,"%d",&y);
            fscanf(in,"%d",&z);
            add(y,z);
        }
        else if(x==1)
        {
            fscanf(in,"%d",&y);
            fscanf(in,"%d",&z);
            z=sum(z)-sum(y-1);
            fprintf(out,"%d",z);
            fprintf(out,"%s","\n");
        }
        else
        {
            fscanf(in,"%d",&y);
            z=f(y);
            fprintf(out,"%d",z);
            fprintf(out,"% s","\n");
        }
    }
    return 0;
}