Cod sursa(job #3245353)

Utilizator BucsMateMate Bucs BucsMate Data 28 septembrie 2024 17:11:45
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct Node
{
    int value;
    int level;
};

ifstream input("input.in");
ofstream output("output.in");


int main()
{
    int n, m;
    cin >> n >> m;
    vector<vector<int>> numbers(n+1, vector<int>());
    for(int i = 0; i < (1<<n); i++){
        int temp;
        cin >> temp;
        numbers[0].push_back(temp);
    }

    for(int lev = 1; lev <= n; lev++){
        if(lev % 2 == 1){
            for(int i = 0; i < (1<<(n-lev+1)); i = i+2){
                numbers[lev].push_back(numbers[lev-1][i] | numbers[lev-1][i+1]);
            }
        }
        else{
            for(int i = 0; i < (1<<(n-lev+1)); i = i+2){
                numbers[lev].push_back(numbers[lev-1][i] ^ numbers[lev-1][i+1]);
            }
        }
    }

    for(int i = 0; i < m; i++){
        int p, b;
        cin >> p >> b;
        numbers[0][p-1] = b;
        int index = p-1;
        if(index % 2 == 1){
            index--;
        }
        for(int lev = 1; lev <= n; lev++){
            if(lev % 2 == 1){
                numbers[lev][index/2] = numbers[lev-1][index] | numbers[lev-1][index+1];
            }
            else{
                numbers[lev][index/2] = numbers[lev-1][index] ^ numbers[lev-1][index+1];
            }
            index = index/2;
            if(index % 2 == 1){
                index--;
            }
        }
        cout << numbers[n][0] << "\n";
    }
    return 0;
}