Cod sursa(job #2736911)

Utilizator sandifx68Fazakas Alexandru sandifx68 Data 4 aprilie 2021 10:27:47
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;

//ifstream f("alb.in");
//ofstream g("alb.out");

FILE *f=fopen("aib.in","r");
FILE *g=fopen("aib.out","w");

unsigned int v[1000005],n,m,val;

void Update(int poz, int val){
    while(poz<=n){
        v[poz]+=val;
        poz+=((poz^(poz-1))+1)>>1;
    }
}

unsigned int Query(int poz){
    unsigned int s=0;
    while(poz>0){
        s+=v[poz];
        poz=(poz-1)&poz;
    }
    return s;
}

int Search(int val){
    int step,i;
    for(step=1;step<n;step<<=1);
    for(i=0;step;step>>=1){
        if(i+step<=n){
            if(v[i+step]<=val){
                i+=step;val-=v[i];
                if(val==0)return i;
            }
        }
    }
    return -1;
}

int main()
{
    fscanf(f,"%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        fscanf(f,"%d",&val);
        Update(i,val);
    }
    for(int i=1;i<=m;i++)
    {
        int act,a,b;
        fscanf(f,"%d",&act);
        if(act==0){
            fscanf(f,"%d%d",&a,&b);
            Update(a,b);
        } else if(act==1){
            fscanf(f,"%d%d",&a,&b);
            fprintf(g,"%d\n",Query(b)-Query(a-1));
        }
        else{
            fscanf(f,"%d",&a);
            fprintf(g,"%d\n",Search(a));
        }
    }
}