Cod sursa(job #1148980)

Utilizator DanutsDanut Rusu Danuts Data 21 martie 2014 13:12:56
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include<fstream>
#include<cstdio>
#define maxn 150100
using namespace std;
FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");
int n,m,v[maxn],x,poz;
int a,b,cod;
void update(int poz,int val){
    while(poz<=n){
        v[poz]+=val;
        poz+=(poz&-poz);
    }
}
int aduna(int st,int dr){
    int s1=0,s2=0;
    st--;
    while(st>0){
        s1+=v[st];
        st-=(st&-st);
    }
    while(dr>0){
        s2+=v[dr];
        dr-=(dr&-dr);
    }
    return s2-s1;
}
void minim(int a){
    int ok=0;
    while(poz<=n && ok==0){
        if(v[poz]==a)
            fprintf(g,"%d\n",poz),ok=1;;
        poz+=(poz&-poz);
    }
    if(ok==0)
        fprintf(g,"%d\n",-1);
}
int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        poz=i;
        fscanf(f,"%d",&x);
        update(poz,x);
    }
    //for(int i=1;i<=n;i++)
    //    fprintf(g,"%d ",v[i]);
    for(int i=1;i<=m;i++){
            fscanf(f,"%d",&cod);
        if(cod==0){
            fscanf(f,"%d%d",&a,&b);
            poz=a;
            update(poz,b);
            // for(int i=1;i<=n;i++)
            //    fprintf(g,"%d ",v[i]);
        }
        else
                if(cod==1){
                    fscanf(f,"%d%d",&a,&b);
                    fprintf(g,"%d\n",aduna(a,b));
                }
                else
                    {
                        fscanf(f,"%d",&a);
                        poz=1;
                        minim(a);
                    }
    }
    return 0;
}