Cod sursa(job #2901981)

Utilizator T_george_TGeorge Teodorescu T_george_T Data 15 mai 2022 00:01:10
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

ifstream in("baruri.in");
ofstream out("baruri.out");

const int NMAX=1e5+10;

int aint[4*NMAX],v[NMAX],poz,val, start,final,sum;
string s;
void build(int node, int st, int dr){
    if(st==dr){
        aint[node]=v[st];
        return;
    }
    build(node<<1, st, (st+dr)>>1);
    build(node<<1|1,(st+dr)/2+1,dr);
    aint[node]=aint[node<<1]+aint[node<<1|1];
}

void update(int node,int st,int dr){
    if(st==dr){
        aint[node]+=val;
        return;
    }
    int mid=(st+dr)>>1;
    if(poz<=mid) update(node<<1, st,mid);
    else update(node<<1|1,mid+1, dr);
    aint[node]=aint[node<<1]+aint[node<<1|1];
}

void query(int node,int st,int dr){
    if(start<=st && dr<=final) {
        sum+=aint[node];
        return ;
    }
    int mid=(st+dr)/2;
    if(start<=mid) query(node<<1, st,mid);
    if(final>mid) query(node<<1|1, mid+1, dr);
}
char c[3000005];
void solve(){
    int n;
    in>>n;
    in.get();
    in.getline(c,3000000);
    int nr=0;
    poz=0;
    for(int i=0;c[i];i++){
        if(c[i]==' '){
            poz++;
            val=nr;
            v[poz]=nr;
            nr=0;
        }
        else
            nr=nr*10+(c[i]-'0');
    }
    v[++poz]=nr;
    int m,tip,b1;
    build(1,1,n);
    in>>m;

    for(int i=1;i<=m;i++){
        in>>tip;
        if(tip==0){
            in>>poz>>val;
            start=max(1,poz-val);
            final=min(n,poz+val);
            sum=0;
            query(1,1,n);
            sum-=v[poz];
            s+= to_string(sum)+'\n';
        }
        else if(tip==1){
            in>>val>>poz;
            update(1,1,n);
        }
        else if(tip==2){
            in>>val>>poz;
            val=-val;
            update(1,1,n);
        }
        else{
            in>>val>>poz>>b1;
            val=-val;
            update(1,1,n);
            v[poz]+=val;
            val=-val;
            poz=b1;
            update(1,1,n);
            v[poz]+=val;
        }
    }
    out<<s;
    s.clear();
}


int main() {
    int k;
    for(in>>k;k>0;k--)
        solve();
    return 0;
}