89602024-02-08 02:55:12qertendBináris fa magassága (50 pont)cpp17Időlimit túllépés 0/50600ms5256 KiB
#include <iostream>
using namespace std;

long powerOf2(int exponent) {
    long out = 1;
    out <<= exponent;
    return out;
}

class Node {
    public:
        int distanceUp;
        long endNodesStart;
        long endNodesEnd;
        long depth;

        void init(long ID, int treeDepth) {
            int layer = 1;
            int tmp = ID;
            while (tmp >= 2) {
                tmp >>= 1;
                layer++;
            }
            distanceUp = 1;
            long layerDif = powerOf2(treeDepth-layer);
            endNodesStart = ID*layerDif;
            endNodesEnd = ID*layerDif + layerDif-1;
        }
};

/**
 * adds the change to end nodes from start to end (inclusive)
*/
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, long start, long end) {
    int max = 0;
    int ID;
    for (long i = start; i <= end; i++) {
        //that extra condition is ugly af but it works
        if (array[i].depth > max && i != 65535) {
            max = array[i].depth;
            ID = i;
        }
    }
    return max;
}

int main() {
    int treeDepth, M;
    cin >> treeDepth;
    cin >> M;
    int longestBranch = 0;
    long arrayLength = powerOf2(treeDepth)-1;
    long endNodesStart = powerOf2(treeDepth-1);
    //cerr << "before array\n";
    Node allNodes[arrayLength];
    //cerr << "after array\n";
    //create Nodes
    for (long i = 0; i < arrayLength; i++) {
        allNodes[i].init(i+1, treeDepth);
    }
    //cerr << "created nodes\n";
    //set default length for end Nodes
    for (long i = endNodesStart; i < arrayLength; i++) {
        allNodes[i].depth = treeDepth-1;
    }
    //cerr << "set default lengths\n";
    //read instructions from stdin
    for (int i = 0; i < M; i++) {
        if (i == 12) {
            cerr << "watch out\n";
        }
        int newDistance, nodeID;
        cin >> nodeID;
        nodeID--;
        cin >> newDistance;
        Node &modifiedNode = allNodes[nodeID];
        int change = newDistance-modifiedNode.distanceUp; 
        modifiedNode.distanceUp = newDistance;
        if (change != 0) updateDepth(change, allNodes, modifiedNode.endNodesStart, modifiedNode.endNodesEnd);
        if (change > 0) {
            long 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";
        //cerr << i << "/" << M << "\r";
    }
}

/**
 * Node array[] as function parameter not an array??
*/
RészfeladatÖsszpontTesztVerdiktIdőMemória
base0/50
1Elfogadva0/03ms1876 KiB
2Időlimit túllépés0/0600ms3320 KiB
3Hibás válasz0/24ms2312 KiB
4Hibás válasz0/24ms2500 KiB
5Hibás válasz0/24ms2500 KiB
6Hibás válasz0/24ms2572 KiB
7Hibás válasz0/34ms2576 KiB
8Hibás válasz0/34ms2572 KiB
9Hibás válasz0/34ms2596 KiB
10Hibás válasz0/34ms2716 KiB
11Időlimit túllépés0/2600ms4056 KiB
12Időlimit túllépés0/2569ms3988 KiB
13Időlimit túllépés0/2573ms4120 KiB
14Időlimit túllépés0/2552ms4280 KiB
15Időlimit túllépés0/2560ms4284 KiB
16Időlimit túllépés0/2550ms4352 KiB
17Időlimit túllépés0/2574ms4544 KiB
18Időlimit túllépés0/2554ms4680 KiB
19Időlimit túllépés0/2561ms4812 KiB
20Időlimit túllépés0/3545ms5004 KiB
21Időlimit túllépés0/3552ms5044 KiB
22Időlimit túllépés0/3545ms5136 KiB
23Időlimit túllépés0/3574ms5256 KiB