Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <queue>
- using namespace std;
- struct node{
- node* from=NULL;
- node* left=NULL;
- node* right=NULL;
- int value;
- node(node *from){
- this->from=from;
- }
- node();
- };
- node* head=new node();
- int D=0;
- vector<int> base;
- vector<node*> base_nods;
- int build_tree(node *curent,int deep,int cur){
- node* left=new node(curent);
- node* right=new node(curent);
- int L,R;
- if(cur!=deep){
- curent->left=left;
- curent->right=right;
- L=build_tree(left,deep,cur+1);
- R=build_tree(right,deep,cur+1);
- curent->value=R+L;
- return R+L;}
- else {
- base_nods.push_back(curent);
- if(D<base.size()){
- curent->value = base[D];
- D++;}
- else
- curent->value = 0;
- return curent->value;
- }
- }
- int left_summ(node* cur){
- if(cur->from!=NULL){
- if(cur->from->left!=cur)
- return (cur->from->left->value)+left_summ(cur->from);
- else
- return left_summ(cur->from);}
- else
- return 0;
- }
- int right_summ(node* cur){
- if(cur->from!=NULL){
- if(cur->from->right!=cur)
- return (cur->from->right->value)+left_summ(cur->from);
- else
- return left_summ(cur->from);}
- else
- return 0;
- }
- int main() {
- int n;
- cin>>n;
- for(int i=0;i<n;i++){
- int tmp;
- cin>>tmp;
- base.push_back(tmp);
- }
- int deep=log2(n);
- if(n!=pow(2,deep))
- deep++;
- build_tree(head,deep,0);
- string command;
- int a,b;
- while(cin>>command){
- if(command=="set"){
- cin>>a>>b;
- base_nods[a-1]->value=b;
- }
- else{
- cin>>a>>b;
- a=left_summ(base_nods[a-1]);
- b=right_summ(base_nods[b-1]);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment