85122024-01-20 03:06:10qertendBináris fa magassága (50 pont)cpp17Futási hiba 0/50569ms6040 KiB
#include <iostream>
#include <cmath>
#include <array>
using namespace std;

struct Node {
    int distanceUp;
    int endNodesStart;
    int endNodesEnd;
    int depth;
};

Node newNode(int ID, int treeDepth) {
    int layer = 1;
    float tmp = ID;
    while (tmp >= 2) {
        tmp /= 2;
        layer++;
    }
    Node out;
    out.distanceUp = 1;
    int layerDif =pow(2, treeDepth-layer);
    out.endNodesStart = ID*layerDif;
    out.endNodesEnd = ID*layerDif + layerDif-1;
    return out;
}

void updateDepth(int change, Node array[], int start, int end) {
    for (int i = start; i <= end; i++) {
        array[i].depth += change;
    }
}

int max(Node array[], int start, int end) {
    int max = 0;
    for (int i = start; i <= end; i++) {
        if (array[i].depth > max) max = array[i].depth;
    }
    return max;
}

int main() {
    int treeDepth, M;
    cin >> treeDepth;
    cin >> M;
    int longestBranch = 0;
    int arrayLength = pow(2, treeDepth)-1;
    int endNodesStart = pow(2, treeDepth-1);
    Node allNodes[arrayLength];
    //create Nodes
    for (int i = 0; i < arrayLength; i++) {
        allNodes[i] = newNode(i+1, treeDepth);
    }
    //set default length for end Nodes
    for (int i = endNodesStart; i < arrayLength; i++) {
        allNodes[i].depth = treeDepth-1;
    }
    //read instructions
    for (int i = 0; i < M; i++) {
        int newDistance, nodeID;
        cin >> nodeID;
        nodeID--;
        cin >> newDistance;
        Node modifiedNode = allNodes[nodeID];
        int change = newDistance-modifiedNode.distanceUp; 
        allNodes[nodeID].distanceUp = newDistance;
        updateDepth(change, allNodes, modifiedNode.endNodesStart, modifiedNode.endNodesEnd);

        if (change > 0) {
            int currentHeight = max(allNodes, modifiedNode.endNodesStart, modifiedNode.endNodesEnd);
            if (currentHeight > longestBranch) longestBranch = currentHeight;
        }
        else if (change < 0) {
            longestBranch = max(allNodes, endNodesStart, arrayLength-1);
        }
        cout << longestBranch << "\n";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base0/50
1Elfogadva0/03ms1872 KiB
2Futási hiba0/06ms4204 KiB
3Futási hiba0/23ms2704 KiB
4Futási hiba0/23ms2828 KiB
5Futási hiba0/23ms3204 KiB
6Futási hiba0/23ms3140 KiB
7Futási hiba0/33ms3000 KiB
8Futási hiba0/33ms3252 KiB
9Futási hiba0/33ms3216 KiB
10Futási hiba0/33ms3212 KiB
11Futási hiba0/228ms5524 KiB
12Futási hiba0/221ms5664 KiB
13Futási hiba0/226ms5576 KiB
14Időlimit túllépés0/2569ms3732 KiB
15Futási hiba0/228ms5944 KiB
16Futási hiba0/26ms5780 KiB
17Futási hiba0/27ms5792 KiB
18Futási hiba0/26ms5784 KiB
19Futási hiba0/26ms5780 KiB
20Futási hiba0/323ms5912 KiB
21Futási hiba0/332ms6040 KiB
22Futási hiba0/332ms5896 KiB
23Futási hiba0/323ms5892 KiB