Cod sursa(job #2325250)

Utilizator rares1012Rares Cautis rares1012 Data 22 ianuarie 2019 12:56:25
Problema Arbori indexati binar Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.39 kb
#include <bits/stdc++.h>
#define DIM 1000000

char BUFF[1000000];

int k=0;

FILE*fi;

int cit(){
    int nr=0;
    while(BUFF[k]<'0' || BUFF[k]>'9'){
        k++;
        if(k==DIM){
            fread(BUFF,1,DIM,fi);
            k=0;
        }
    }
    while(BUFF[k]>='0' && BUFF[k]<='9'){
        nr=nr*10+BUFF[k]-'0';
        k++;
        if(k==DIM){
            fread(BUFF,1,DIM,fi);
            k=0;
        }
    }
    return nr;
}

int aib[1<<18];

int v[100001];

void init(int st,int dr,int p){
    if(st==dr){
        aib[p]=v[st];
    }
    else {
        int mij=(st+dr)/2;
        init(st,mij,p*2);
        init(mij+1,dr,p*2+1);
        aib[p]=aib[p*2]+aib[p*2+1];
    }
}

void update(int val,int nod,int st,int dr,int p){
    if(st==dr)
        aib[p]+=val;
    else {
        int mij=(st+dr)/2;
        if(nod<=mij)
            update(val,nod,st,mij,p*2);
        else update(val,nod,mij+1,dr,p*2+1);
        aib[p]=aib[p*2]+aib[p*2+1];
    }
}

int calc(int a,int b,int st,int dr,int p){
    if(a<=st && dr<=b)
        return aib[p];
    else {
        int mij=(st+dr)/2,s=0;
        if(a<=mij){
            s+=calc(a,b,st,mij,p*2);
        }
        if(b>=mij+1)
        {
            s+=calc(a,b,mij+1,dr,p*2+1);
        }
        return s;
    }
}

int main()
{
    int n,m,k,i,q,a,b,r,p,s;
    FILE*fo;
    fi=fopen("aib.in","r");
    fo=fopen("aib.out","w");
    fread(BUFF,1,n,fi);
    n=cit();
    m=cit();
    for(i=1;i<=n;i++){
        v[i]=cit();
    }
    init(1,n,1);
    for(i=0;i<m;i++){
        q=cit();
        if(q==0)
        {
            a=cit();
            b=cit();
            update(b,a,1,n,1);
        }
        else if(q==1){
            a=cit();
            b=cit();
            fprintf(fo,"%d\n",calc(a,b,1,n,1));
        }
        else if(q==2){
            k=cit();
            r=0;
            p=1<<17;
            s=0;
            q=0;
            while(p>0){
                if(r+p<=n){
                    q=calc(r+1,r+p,1,n,1);
                    if(s+q<k){
                    r+=p;
                    s+=q;
                    }
                }
                p/=2;
            }
            if(s+calc(r+1,r+1,1,n,1)==k)
                fprintf(fo,"%d\n",r+1);
            else fprintf(fo,"-1\n");
        }
    }
    fclose(fi);
    fclose(fo);
    return 0;
}