OSaged
OSaged
#include <bits/stdc++.h>
Function :-
memset(BIT, 0, sizeof(BIT)); //intlize arr with 0
//rotate matrix
void rotat(vii& X) {
vii tmp(X[0].size(), vi(X.size()));
for (int i = 0; i < X.size(); i++)
for (int j = 0; j < X[i].size(); j++)
tmp[X[i].size() - j - 1][i] = X[i][j];
X = tmp;
}
if (str.find(str1) != string::npos)
transform(str.begin(), str.end(), str.begin(), ::toupper);
1
Bitwise :-
//first digit of number
X & -X
//pow of two just have 1 only
n & (n - 1) && (n != 0) -- > 0
bitset<2000007> Z;
// all point start with one
Z.set();
// get first digit with 1 after b
a = Z._Find_next(b);
int n = 10;
bitset<32> s(n);
00000000000000000000000000001010
s.to_ullong() -- >> to decimal value
s.set(3); // Set bit at position 3 to 1
s.reset(7); // Set bit at position 7 to 0
bool bit3 = s[3]; // Check bit at position 3
ll leastBit(ll num) {
return (num & -num);
}
int turnOnLastZero(int S) {
return S | S + 1;
}
int turnOffLastBit(int S) {
return S & S - 1;
}
int turnOnLastConsecutiveZeroes(int S) {
return S | S - 1;
}
2
int turnOffLastConsecutiveBits(int S) {
return S & S + 1;
}
math :-
Pi 3.141592653589793238462643383279502884
// mode_inverse
ll exp_mod(ll a, ll n) {
ll res = 1;
for (; n > 0; n /= 2) {
if (n % 2) res = res * a % mode;
a = a * a % mode;
}
return res;
}
ll inv_mod(ll a) {
return exp_mod(a, mode - 2);
}
//ax+by=gcd(a,b)
ll gcdExtended(ll a, ll b, ll* x, ll* y)
{
if (a == 0){
*x = 0;
*y = 1;
return b;
}
ll x1, y1;
ll gcd = gcdExtended(b % a, a, &x1, &y1);
*x = y1 - (b / a) * x1;
*y = x1;
return gcd;
}
ll gcd(ll a, ll b){
if (b == 0)
return a;
return gcd(b, a % b);
}
ll lcm(ll a, ll b){
return (a / gcd(a, b)) * b;
3
}
nCr = fac(n)/fec(r)*fac(n-r)
nPr = fac(n)/fac(n-r)
(a + b) % c = ((a % c) + (b % c)) % c
(a * b) % c = ((a % c) * (b % c)) % c
(a - b) % c = ((a % c) - (b % c) + c) % c
(a / b) % c = ((a % c) * ((b ^ -1) % c)) % c
ll modfpow(ll x, ll y, ll z){
ll result = 1;
while (y > 0){
if (y % 2 == 1)result = ((result % z) * (x % z)) % z;
x = ((x % z) * (x % z)) % z;
y = y / 2;
}
return result;
}
void matrix_multiply(int A[][MAX_SIZE], int B[][MAX_SIZE], int C[][MAX_SIZE], int m, int n, int p) {
// Multiply matrices A and B, storing the result in matrix C
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
int sum = 0;
for (int k = 0; k < n; k++) {
sum += A[i][k] * B[k][j];
}
C[i][j] = sum;
}
}
}
ll catalan(int n){
return (nCr(2 * n, n) * Inv(n + 1)) % MOD;
}
Binary-search-tree :-
//creat node
struct node
{
int key;
struct node* left, * right;
};
struct node* newNode(int item)
{
node* temp = new node;
temp->key = item;
temp->left = temp->right = NULL;
return temp;
}
//insert to node node
node* insert(struct node* node, int key)
{
if (node == NULL)
return newNode(key);
return node;
}
//delete node
struct node* minValueNode(struct node* node)
{
struct node* current = node;
return current;
}
struct node* deleteNode(struct node* root, int key)
{
if (root == NULL) return root;
else {
if (root->left == NULL) {
struct node* temp = root->right;
free(root);
return temp;
}
else if (root->right == NULL) {
struct node* temp = root->left;
free(root);
return temp;
}
struct node* temp = minValueNode(root->right);
root->key = temp->key;
root->right = deleteNode(root->right, temp->key);
}
return root;
}
5
// get element of BST in ordered way
void inorder(struct node* root)
{
if (root != NULL)
{
inorder(root->left);
cout << root->key << " ";
inorder(root->right);
}
}
Fenwick-tree :-
ll rangequery(const vi& Z, ll l, ll r) {
ll summ = 0;
return summ;
}
// to get all element greater than k in range l , r -> take quary in array and sort in
// I can make fenwick of XoR
// I can binary search for prefix value on it
Segment-tree :-
// it like fenwick but can do more operation like min or max in range
// we first make array of size 2*n -> left and right are 2*i+1 – 2*i+2
lazy[si] = 0;
}
// my function
vi Z(1e6 * 3, 0);
ll n;
int getrange(int s, int e, int l, int r, int k) {
if (s > r || e < l) return 0;
if (s >= l && e <= r) return Z[k];
int at = (s + e) / 2;
return getrange(s, at, l, r, k * 2 + 1) + getrange(at + 1, e, l, r, k * 2 + 2);
}
void updates(int s, int e, int k, int index, int val) {
if (s == e) {
Z[k] += val;
return;
}
int at = (s + e) / 2;
if (index >= s && index <= at) updates(s, at, k * 2 + 1, index, val);
else updates(at + 1, e, k * 2 + 2, index, val);
Z[k] += val;
}
void update(int i, ll k) {
updates(0, n - 1, 0, i, k);
}
ll summ(int i) {
return getrange(0, n - 1, 0, i, 0);
7
Trie-tree :-
// to start new node node * X = new node();
struct node {
node* next[2] = { NULL };
int val = 0;
};
node* root, * AT_TRIE, * TRIE = new node[32 * 100100];
void add(node*& X, int n, int k) {
if (!X) *(X = AT_TRIE++) = node();
if (!n) X->val += k;
else add(X->next[n & 1], n >> 1, k);
}
int get(node* X, int n) {
if (!X) return 0;
if (!n) return X->val;
return get(X->next[n & 1], n >> 1);
}
Graph ------------------>>>>>>>>>
// Tree to know every child and it’s parents
struct node
{
int val, pra;
vector<int> c;
};
vii Y;
vector<node> Z;
void build(int k) {
for (int i = 0; i < Y[k].size(); i++) {
if (Y[k][i] == Z[k].pra)continue;
Z[k].c.push_back(Y[k][i]);
Z[Y[k][i]].pra = k;
build(Y[k][i]);
}
}
BFS :-
// to get level of the node or distance
vii Y;
vector<int> lvl(10100, -1);
int nodeLevel(int start)
{
queue<int> Q;
Q.push(start);
lvl[start] = 0;
while (!Q.empty()) {
int re = Q.front();
Q.pop();
for (int i = 0; i < Y[re].size(); i++) {
if (lvl[Y[re][i]] != -1) continue;
lvl[Y[re][i]] = lvl[re] + 1;
Q.push(Y[re][i]);
}
}
8
}
// monomatic stack
ll n; cin >> n;
vi v(n); cin(v);
vector<ll>m(n, -1);
stack<pair<ll, ll>>st;
for (int i = 0; i < n; ++i) {
if (st.empty())
{
st.emplace(v[i], i);
}
else if (v[i] > st.top().first)
{
while (!st.empty() && v[i] > st.top().first)
{
m[st.top().second] = i;
st.pop();
}
st.emplace(v[i], i);
}
else
{
st.emplace(v[i], i);
}
}
ll q; cin >> q;
while (q--)
{
ll x; cin >> x;
if (m[x - 1] == -1)cout << "-1\n";
else cout << m[x - 1] + 1 << "\n";
}
DP :-
ll Longest_Increasing_SubSeq(vi X) {
vi Z;
for (int i = 0; i < X.size(); i++){
ll re = upper_bound(Z.begin(), Z.end(), X[i]) - Z.begin();
if (re == Z.size())Z.push_back(X[i]);
else Z[re] = X[i];
}
return Z.size();
}