Cod sursa(job #2502870)

Utilizator pitradaPit-Rada Ionel-Vasile pitrada Data 1 decembrie 2019 18:57:07
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
#include <fstream>
#include <math.h>
using namespace std;
ifstream  cin("aib.in");
ofstream cout("aib.out");
int n,m,r,v[100005];
struct nod{
    int a,b;
    long long sum;
}s[400];
int main(){
    int i,j,k,c,a,b;
    long long x,y;
    cin>>n>>m;
    r=sqrt(n);
    for(i=1;i<=n;i++)cin>>v[i];
    for(j=1,x=0,k=0,i=1;i<=n;i++){
        x+=v[i];
        if(i%r==0 || i==n){
            k++; s[k].a=j; s[k].b=i; s[k].sum=x;
            j=i+1;x=0;
        }
    }
    while(m){
        cin>>c;
        if(c==0){
            cin>>a>>b;
            v[a]+=b;
            i=1+(a-1)/r;
            x=0;
            for(j=s[i].a;j<=s[i].b;j++){
                x+=v[j];
            }
            s[i].sum=x;
        }
        if(c==1){
            cin>>a>>b;
            i=1+(a-1)/r;
            j=1+(b-1)/r;
            if(i==j){
                x=0;
                while(a<=b){
                    x+=v[a];
                    a++;
                }
                cout<<x<<"\n";
            }
            else{
                x=0;
                while(a<=s[i].b){
                    x+=v[a];
                    a++;
                }
                i++;
                while(i<j){
                    x+=s[i].sum;
                    i++;
                }
                a=s[j].a;
                while(a<=b){
                    x+=v[a];
                    a++;
                }
                cout<<x<<"\n";
            }
        }
        if(c==2){
            cin>>y;
            x=0;
            for(i=1;i<=k;i++){
                x=x+s[i].sum;
                if(x>=y)break;
            }
            if(x<y)cout<<"-1\n";
            else{
                j=s[i].b;
                while(x>=y){
                    x=x-v[j];
                    j--;
                }
                j++;
                x+=v[j];
                if(x==y)cout<<j<<"\n";
                else cout<<"-1\n";
            }
        }
        m--;
    }
    cin.close(); cout.close();
    return 0;
}