Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- long long n, m, type, value, a[300300];
- bool flag = 1;
- struct node
- {
- long long value, numberOfNodes;
- struct node *left, *right;
- };
- struct node *root = NULL;
- struct node *newNode(long long value)
- {
- struct node *New = (struct node *)malloc(sizeof(struct node));
- New->value = value;
- New->left = New->right = NULL;
- New->numberOfNodes = 1;
- return New;
- }
- struct node* addSalary(struct node* node, long long value)
- {
- if (node == NULL) //if the node is a leaf add new node
- return newNode(value);
- node->numberOfNodes++;
- if (value <= node->value)
- node->left = addSalary(node->left, value);
- else
- node->right = addSalary(node->right, value);
- return node;
- }
- void InsertArray(long long left, long long right)
- {
- if(left > right)
- return;
- long long mid = (left + right)/2;
- if(flag) // if the tree is empty make this node the root
- {
- root = addSalary(root, a[mid]);
- flag = 0;
- }
- else
- addSalary(root, a[mid]);
- InsertArray(mid + 1, right);
- InsertArray(left, mid - 1);
- }
- long long upperBound(struct node* curr, long long value)
- {
- if (curr == NULL)
- return 0;
- long long ret = 0;
- if (curr->value >= value)
- {
- ret = upperBound(curr->left, value);
- if(curr->right != NULL)
- ret += curr->right->numberOfNodes;
- if(curr->value > value)
- ret++;
- }
- else
- ret = upperBound(curr->right, value);
- return ret;
- }
- int main()
- {
- cin >> n;
- for(int i=0; i<n ; i++)
- cin >> a[i];
- sort(a, a+n);
- InsertArray(0, n-1);
- cin >> m;
- for(int i=0 ; i<m ; i++)
- {
- cin >> type >> value;
- if(type == 2)
- cout << upperBound(root, value) << endl;
- else
- addSalary(root, value);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement