CF – 464E The Classic Problem

Category: Data Structure, Persistent segment Tree
Solution:
See official Editorial here for understanding the basics.

Implementation:

#include<bits/stdc++.h>
using namespace std;
/*------- Constants---- */

#define Long                    long long
#define Ulong                   unsigned long long
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define pb(a)                   push_back((a))
#define SZ(a)                   (int) a.size()
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define EPS                     1e-9
#define xx                      first
#define yy                      second
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(x)                   int x;scanf("%d",&x)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
#define ms(ara_name,value)      memset(ara_name,value,sizeof(ara_name))

/*************************** END OF TEMPLATE ****************************/

const int N = 2e5+500;
int n,m,sz;
vector<pair<int,int> > G[N];
int root[N];
long long B = 37;
long long MOD = 1e9 + 7;
long long POW[N], POWER[N];
int zero;
struct  Node
{
	int ls,rs;
	int cnt;
	long long hash;	
} node[N*40];

void build(int &n,int b,int e)
{
	n = ++sz;
	if(b==e) {
		node[n].hash = node[n].cnt = 0;
		return;
	}
	int mid = (b+e)/2;
	build(node[n].ls, b, mid);
	build(node[n].rs, mid+1,e);
	node[n].cnt = node[node[n].ls].cnt + node[node[n].rs].cnt;
	node[n].hash = node[node[n].ls].hash +  POW[mid - b + 1] * node[node[n].rs].hash;
}
void update(int &n,int pre,int b,int e,int pos)
{
	n = ++sz;
	node[n] = node[pre];
	if(b==e && b == pos) {
		node[n].hash = 1;
		node[n].cnt = 1;
		return;
	}
	int mid = (b+e)/2;
	if(pos <= mid) update(node[n].ls, node[pre].ls , b, mid, pos);
	else update(node[n].rs, node[pre].rs, mid+1,e,pos);
	node[n].cnt = node[node[n].ls].cnt + node[node[n].rs].cnt;
	node[n].hash = node[node[n].ls].hash +  POW[mid - b + 1] * node[node[n].rs].hash;
}
void updateRange(int &n,int pre,int id2 , int b,int e,int i, int j)
{
	
	n = ++sz;
	node[n] = node[pre];
	if(b>j || e < i) return;

	if(b >= i && e <= j ) {
		node[n] = node[id2];
		return;
	}
	int mid = (b+e)/2;
	updateRange(node[n].ls, node[pre].ls, node[id2].ls, b, mid, i, j);
	updateRange(node[n].rs, node[pre].rs, node[id2].rs, mid+1,e,i, j);
	node[n].cnt = node[node[n].ls].cnt + node[node[n].rs].cnt;
	node[n].hash = node[node[n].ls].hash +  POW[mid - b + 1] * node[node[n].rs].hash;
}

int query(int n,int b,int e,int i,int j)
{
	if(b>j||e<i) return 0;
	if(b>=i&&e<=j) return node[n].cnt;
	int mid = (b+e)/2;
	return query(node[n].ls, b, mid, i, j) + query(node[n].rs, mid+1,e,i,j);
}
int find(int root,int w)
{
	
	int low = w, high = N , mid, ans = w - 1;
	while(low <= high) {
		mid = (low + high ) /2;
		int oo = query(root,0,N,w,mid);
		
		if( oo == mid - w+ 1) {
			ans = mid ;
			low = mid+1;
		}
		else high = mid-1;
	}
	return ans + 1;
}

bool queryIn(int r1 ,int r2, int b,int e)
{
	if(b==e) {
		return node[r1].hash > node[r2].hash;
	}
	int mid = (b+e)/2;
	if( node[node[r1].rs]. hash == node[node[r2].rs]. hash ) return queryIn(node[r1].ls, node[r2].ls, b , mid ) ;
	else return queryIn(node[r1].rs, node[r2].rs, mid+1,e);
}
long long tot = 0;
void Trv(int n,int b,int e)
{


	if(b==e) {
		if(node[n].hash) { 
			tot += POWER[b];
			tot %= MOD;
		}
		return;
	}
	int mid = (b+e)/2;
	Trv(node[n].ls, b, mid);
	Trv(node[n].rs, mid+1,e);
}

void show(int r,int b , int e)
{
	if(b==e) {printf("%lld",node[r].hash);
                  return;
        }
	int mid = (b+e)/2;
	show(node[r].ls, b , mid);
	show(node[r].rs , mid+1,e);
}
struct Vertex
{
	int id;
	int r;
	bool operator<(const Vertex &p) const {
		return queryIn(r,p.r,0,N);
	}
} vlist[N];
bool vis[N];
int F[N];
bool see[N];
void print(Vertex x)
{
	printf("Value of %d : ", x.id);
	show(x.r,0,N);
	cout << endl;
}
void dij(int s,int t)
{
	Vertex S = {s,zero};
	//print(S);
	priority_queue<Vertex> pq;
	pq.push(S);
	while(!pq.empty()){
		Vertex u  = pq.top(); pq.pop();
		if(vis[u.id]) continue;
		vis[u.id] = 1;
		if(u.id == t) break;

		for(auto a : G[u.id]) {
			int v = a.first, w = a.second;
			if(vis[v]) continue;
			int ho = find(u.r,w);
			int tmp, tmp2;
			
			update(tmp, u.r, 0, N , ho  );
			updateRange(tmp2, tmp, zero, 0, N , w, ho - 1);
			
			Vertex T = {v, tmp2};
			//print(T);
			if(see[v] == 0 ||  vlist[v] < T ) {
				
				vlist[v] = T;
				see[v] = 1;
				F[v] = u.id;
				pq.push(vlist[v]);
				
			}
		}
	}
	

	if(vis[t]) {
		Trv(vlist[t].r, 0, N);
		cout << tot << endl;
		vector<int> ans;
		while(t!= s) {
			ans.pb(t);
			t = F[t];
		}
		ans.pb(s);
		reverse(all(ans));
		printf("%ld\n",ans.size());
		for(auto a: ans ) printf("%d ",a);
		printf("\n");
		
	}

	else printf("-1\n");
	

}
int main()
{
	//freopen("in.txt","r",stdin);
	scanf("%d %d",&n,&m);
	POW[0] = POWER[0] = 1;
	for(int i = 1; i < N; i ++ ) POW[i] = (POW[i-1] * B) % MOD, POWER[i] = (POWER[i-1] * 2) % MOD;
	for(int i = 0; i < m ; i ++ ) {
		int a,b,x;
		scanf("%d %d %d",&a,&b,&x);
		G[a].pb(mp(b,x));
		G[b].pb(mp(a,x));

	}
	build(zero,0,N);
	int s,t;
	scanf("%d %d",&s,&t);

 	dij(s,t);
	return 0;
}

Codeforces – 375D

The problem is a great learning.It helped me to implement MO’s algorithm and also Union By Rank.
First Solution : MO’s Algorithm.

    Euler tour in the tree.Determine the range of a subtree of a node
    Sort the query according to MO’S algorithm.
    For each addition, Update how many times the added colour appeared in the range, Update a bit for range query.
    For deletion, Decrease the count of the colour, also update the bit.
    For answer, query in the bit and calculate how many number in range [k,MAX]

/*

 *************************
 Id  : Matrix.code
 Task: 375D
 Date: 2016-01-26

 **************************

 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define SZ(a)                   (int) a.size()
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/

const int N = 1e5+5;
int w[N];
int L[N],R[N] ,cnt = -1 ,ar[N] , c[N];
bool vis[N];
int block;
int occ[N];
int pos[N];
vector<int> G[N];
struct Query{
      int l,r,k,i;
      bool operator<(const Query &q ) const {
            if(l/block == q.l/ block) return r < q.r;
            else return l < q.l;
      }
};
vector<Query> q;
void dfs(int u)
{
      vis[u] = 1;
      L[u] = ++cnt;
      ar[cnt] = c[u];
      for(auto a: G[u]) if(vis[a]== 0) {
            dfs(a);
      }
      R[u] = cnt;

}
int b[N];

void update(int x,int v)
{
      for(;x<N;x+=x&-x) b[x] += v;
}
int query(int x)
{

      int ret = 0;
      for(; x>0; x-=x&-x) ret += b[x];
      return ret;
}
void add(int ind)
{
      int v = ar[ind];
      int now = pos[v];
      if(now) {
            update(now,-1);
            occ[now] --;
      }
      pos[v] = now +1;
      occ[pos[v]] ++;
      update(pos[v] ,1);
}

void del(int ind)
{
      int v= ar[ind];
      int now = pos[v];
      if(now) {
            update(now,-1);
            occ[now] --;
            pos[v] = now - 1;
      }
      if(pos[v]) {
            occ[pos[v]] ++;
            update(pos[v],1);
      }
}
int ans[N];
int main()
{
      //freopen("in.txt","r",stdin);

      Dii(n,m);
      for(int i= 1; i<= n; i ++) {
            Si(c[i]);
      }
      for(int i= 0;i < n-1;i ++ ) {
            Dii(a,b);
            G[a].push_back(b);
            G[b].push_back(a);
      }
      block = sqrt(n) + 1;
      dfs(1);
      for(int i= 0; i<  m; i ++ ) {
            Dii(u,k);
            q.push_back({L[u],R[u],k,i});
      }
      sort(all(q));
      int curl = 0, curr = 0;
      for(int i= 0;i < q.size(); i ++ ) {
            int L=  q[i].l, R = q[i].r;


            while(curl > L) {add(curl-1),curl--;}
            while(curr <=R) {add(curr),curr++;}
            while(curl < L) {del(curl), curl++;}
            while(curr>R+1) {del(curr-1),curr--;}
            ans[q[i].i] = query(N-1) - query(q[i].k-1);
      }
      for(int i= 0;i < SZ(q); i ++ ) {
            printf("%d\n", ans[i]);
      }
      return 0;
}

Second Solution : Union By Rank.

    Take all the query and store them separately for each node
    dfs traversal of the tree and Merge two subtree according to their size
    while joining two subtree, The number of occurance of a color can increase, We add this to num vector
/*
 
 *************************
 Id  : Matrix.code
 Task: 375D - Union By Rank
 Date: 2016-01-27
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define SZ(a)                   (int) a.size()
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/

const int N = 1e5+55;
vector<int> G[N];
vector<pair<int,int> > Q[N];
int c[N];
int finalAns[N];

struct dta{
      map<int,int> Map;
      vector<int> num; // num[i] determines how many color have >=i occurance
      
      dta(int c){
            Map[c] = 1;
            num.push_back(0);
            num.push_back(1);
      }
};
dta * T[N];

void Merge(int a,int b)
{
      if(T[a]->Map.size() < T[b]->Map.size() ){
            dta * temp = T[a];
            T[a] = T[b];
            T[b] = temp;
      }
      for(auto i : T[b]->Map) {
            int c = i.first,n = i.second;
            int already = T[a]->Map[c];
            for(int j = already + 1; j <= already + n ; j ++ ) {
                  if(j>=T[a]->num.size()) T[a]->num.push_back(0);
                  T[a]->num[j] ++;
            }
            T[a]->Map[c] += n;
      }
      
}
void dfs(int u,int p=-1)
{
      T[u] = new dta(c[u]);
      
      for(auto a : G[u]) if(a!=p) {
            dfs(a,u);
            Merge(u,a);
      }
      for(int i= 0;i < SZ(Q[u]); i ++ ) {
            int k = Q[u][i].first, ind = Q[u][i].second;
            if(k >= T[u]->num.size()) finalAns[ind] = 0;
            else finalAns[ind] = T[u]->num[k];
      }
      
}

int main()
{
      //freopen("in.txt","r",stdin);
      
      Dii(n,m);
      for(int i= 1; i<= n; i ++) {
            Si(c[i]);
      }
      for(int i= 0;i < n-1;i ++ ) {
            Dii(a,b);
            G[a].push_back(b);
            G[b].push_back(a);
      }
      for(int i= 0;i < m; i ++ ) {
            Dii(v,k);
            Q[v].push_back(mp(k,i));
      }
      dfs(1);
      for(int i= 0;i < m; i ++ ) {
            printf("%d\n",finalAns[i]);
      }
      return 0;
}

Union By Rank

Union By Rank is common Technique in Disjoint-Set.
The application of this technique is needed for Kruskal’s Minimum Spanning Tree.
Normal Kruskal Code using path-compression would look like this .

void init(int n)
{
      for(int i = 1;i <= n;i ++) p[i] = i;
}
int find(int u)
{
	if(p[u]==u) return u;
	else return p[u] = find(p[u]);
}
void Merge(int a,int b)
{
	int u = find(a);
	int v = find(b);
	if(u!=v) {
		p[u] = v ; // p[v] = u both are correct
	}
}

Union By Rank is Simillar to this But We use rank to determine of the new parent.
Rank can be the size of the set.
So the modified code would be

void init(int n)
{
     for(int i= 1;i <= n; i ++ ) p[i] = i,R[i] = 1;
}
int find(int u)
{
	if(p[u]==u) return u;
	else return p[u] = find(p[u]);
}
void Merge(int a,int b)
{
	int u = find(a);
	int v = find(b);
	if(u!=v) {
		if(R[u] > R[v]) {
			P[v] = u;
			R[u] += R[v];
		}
		else {
			P[u] = v;
			R[v] += R[u];
		}
	}
}

Now this technique can be used to particular different kind of problems :

Problem : Link
Discussion From Codeforces Tutorial:

The name of this problem is anagram for ”Small to large”. There is a reason for that πŸ™‚ The author solution for this problem uses the classic technique for computing sets in tree. The simple solution is the following: let’s find for each vertex v the ”map” β€” the number of occurences for each colour, ”set<pair>” β€” pairs the number of occurences and the colour, and the number sum β€” the sum of most frequent colours in subtree of v. To find that firstly we should find the same thing for all childs of v and then merge them to one. These solution is correct but too slow (it works in O(n^2 * logn) time). Let’s improve that solution: every time when we want to merge two map-s a and b let’s merge the smaller one to larger simply by iterating over all elements of the smaller one (this is the “Small to large”). Let’s consider some vertex v: every time when vertex v will be moved from one map to another the size of the new map will be at least two times larger. So each vertex can be moved not over than logn times. Each moving can be done in O(logn) time. If we accumulate that values by all vertices then we get the complexity O(n(logn)^2).

I saw the solutions that differs from author’s but this technique can be used in a lot of other problems.

My code :


/*

 *************************
 Id  : Matrix.code
 Task: 600E
 Date: 2016-01-27

 **************************

 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define SZ(a)                   (int) a.size()
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/

const int N = 1e5+5;
map<int,int > T[N];
int p[N];
int c[N];
Long finalAns[N];
vector<int> G[N];
Long iMax[N], cnt[N];

void Merge(int a,int b)
{
      if(SZ(T[p[a]]) < SZ(T[p[b]])) swap(p[a],p[b]);
      int id = p[a];
      for(auto i : T[p[b]]) {
            int col = i.Fr, occ = i.Sc;
            T[id][col] += occ;
            if(T[id][col] > iMax[id] ) {
                  iMax[id] = T[id][col];
                  cnt[id] = col;
            } else if(T[id][col] == iMax[id]) cnt[id] += col;
      }
}
void dfs(int u,int par=-1)
{
      for(auto a: G[u]) if(a!=par) {
            dfs(a,u);
            Merge(u,a);

      }
      finalAns [u] = cnt[p[u]];
}
int main()
{
      //freopen("in.txt","r",stdin);

      Di(n);
      for(int i= 1;i <= n;i ++ ) {
            Si(c[i]);
            p[i] = i;
            cnt[i] = c[i];
            iMax[i] = 1;
            T[i][c[i]] = 1;
      }

      for(int i= 0;i < n-1;i ++ ) {
            Dii(a,b);
            G[a].pb(b);
            G[b].pb(a);
      }
      dfs(1);
      for(int i= 1;i <= n; i++ ) printf("%lld ",finalAns[i]);
      return 0;
}

CF 547C

Problem Link : 547C
Discussion : This problem uses PIE,
For details please see this Link

Here is my implementation:



/*
 
 *************************
 Id  : Matrix.code
 Task: 547C
 Date:
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/

const int N = 5e5+5;
int a[N];
vector<int>f[N];
bool inq[N];
int d[N];
bool vis[N];

void seive()
{
      for(int i= 2; i < N; i ++ ) {
            if(vis[i]) continue;
            f[i].pb(i);
            for(int j = 2 * i ; j <N ; j += i ) {
                  f[j].pb(i);
                  vis[j]=1;
            }
      }
}

int size = 0;
int main()
{
      seive();
      Dii(n,q);
      for(int i = 1;i <= n; i ++ ) Si(a[i]);
      Long ans = 0;
      while(q--){
            Di(in);
            if(inq[in] == 0){
                  
                  inq[in] =1;
                  int SZ = f[a[in]].Sz;
                  Long t = 0;
                  for(int i= 1; i < 1<<SZ ; i ++ ) {
                        int p = 1,cnt=0;
                        for(int j = 0; j < SZ; j ++ ) {
                              if(i&1<<j) {
                                    p *= f[a[in]][j];
                                    cnt ++;
                              }
                        }
                        t += (cnt&1 ? 1 : -1 ) * d[p];
                        d[p] ++;
                        
                  }
                  ans+= size - t;
                  printf("%lld\n", ans);
                  size ++;
            }
            else {
                  size --;
                  inq[in] = 0;
                  int SZ = f[a[in]].Sz;
                  Long t = 0;
                  for(int i= 1;i <1<<SZ; i ++ ){
                        int p=1,cnt = 0;
                        for(int j= 0;j < SZ; j ++ ){
                              if(i&1<<j) {
                                    p *= f[a[in]][j];
                                    cnt ++;
                              }
                        }
                        d[p]--;
                        t += (cnt &1 ? 1:-1) * d[p];
                        
                  }
                  ans -= size - t;
                  printf("%lld\n", ans);
                  
            }
      }
      
      return 0;
}

SQRT – DECOMPOSITION

Problem : CF – 455D



/*
 
 *************************
 Id  : Matrix.code
 Task: 455D
 Date: 
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < (n) ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/
const int N = 1e5+5;
const int SZ=320;
int a[N];
int low[SZ], high[SZ] , num[N], cnt[SZ][100101];
deque<int> q[SZ];


void update(int x,int y)
{
      int b = num[y];
      int index = y - low[b];
      int v = q[b][index];
      q[b].erase(q[b].begin() + index);
      cnt[b][v] --;
      for( --b; b>= num[x];  b--) {
            int back = q[b].back();
            q[b].pop_back();
            cnt[b][back] --;
            q[b+1].push_front(back);
            cnt[b+1][back] ++;
      }
      b ++;
      q[b].insert(q[b].begin() + (x-low[b]), v );
      cnt[b][v] ++;
}

int query(int x,int y,int k)
{
      if(num[x] == num[y]) {
            int res = 0;
            int b = num[x];
            int p = x - low[b] , p2 = y - low[b];
            
            for(int i = p; i <= p2; i ++ ) {
                  if(q[b][i] == k) {
                        res ++;
                  }
            }
            return res;
      }
      int b = num[x] , res = 0;
      for(int i = x; num[i] == num[x] ; i ++) {
            if(q[b][i - low[b]]== k) {
                  res ++;
            }
      }
      for(int i = num[x] + 1; i < num[y] ; i ++ ) {
            res += cnt[i][k];
      }
      b = num[y];
      for(int i = y; num[y] == num[i]  ; i--) {
            res += q[b][i - low[b]] == k;
      }
      return res;
}

int main()
{
      
      Di(n);
      for(int i = 1;i <= n; i ++ ) Si(a[i]);
      int sq = sqrt(n) + EPS , cn = 0,col = 0;
      low[0] =1;
      for(int i = 1; i <=n ;i ++ ) {
            cn ++;
            if(cn > sq) {
                  cn = 0;
                  col ++;
                  low[col] = i;
            }
            num[i] = col;
            high[ num[i]] = i;
            q[num[i]].push_back(a[i]);
            cnt[ num[i]][a[i]] ++;
      }
      
      
      
      Di(q);
      int z = 0;
      while(q--  ) {
            Di(t);
            if(t==1) {
                  Dii(x,y);
                  x = (x + z-1) %n + 1;
                  y = (y + z-1) %n + 1;
                  if(x>y)swap(x,y);
                  update(x,y);
            }
            else {
                  Diii(x,y,k);
                  x = (x+z-1)%n+1;
                  y = (y+z-1)%n+1;
                  k = (k+z-1)%n+1;
                  if(x>y)swap(x,y);
                  z=query(x,y,k);
                  printf("%d\n",z);
                  
            }
      }
      return 0;
}

CF 55D

Problem : 55D
Category : Digit DP

/*
 
 *************************
 Id  : Matrix.code
 Task:
 Date:
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/
const int MOD = 2520;
int ar[20];
Long dp[20][50][MOD+1];
int id[MOD+1];
int nxt[MOD+1][11];

Long fo(int ind, int LCM , int Rem, bool flag )
{
      if(ind < 0 ) return Rem % LCM == 0;
      if(flag == 0 && dp[ind][id[LCM]][Rem] !=-1 ) return dp[ind][id[LCM]][Rem];
      Long res = 0, lim = flag ? ar[ind]: 9;
      for(int i = 0; i <= lim ;i ++ ) {
            res += fo(ind-1,nxt[LCM][i] , (Rem * 10 + i) %MOD , flag && (i==lim) );
      }
      if(flag) return res;
      return dp[ind][id[LCM]][Rem] = res;
}
Long solve(Long n)
{
      int ind=0;
      for(;n;ind++,n/=10)ar[ind]=n%10;
      return fo(ind-1,1,0,true);
}

void Process()
{
      int cnt = 0;
      for(int i=1;i <= MOD; i ++ ) {
            if(MOD % i == 0 ) id[i] = cnt ++;
      }
      for(int i = 1;i <= MOD;i ++) {
            for(int j= 0;j <10 ; j ++ ) {
                  if(j > 1 ) nxt[i][j] = i * j / gcd(i,j);
                  else nxt[i][j]  = i;
            }
      }
}
int main()
{
      Process();
      Di(t);
      ms(dp,-1);
      while(t--){
            Long a,b;
            scanf("%lld %lld",&a,&b);
            printf("%lld\n", solve(b) - solve(a-1));
      }
}

519E CF

Link : Problem
Solution:

/*
 
 *************************
 Id  : Matrix.code
 Task:
 Date:
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/

const int N = 1e5+5;
const int LG = 18;
int P[N][LG] , dep[N];
int Time[N] , dfn = 0;
vector<int> sub[N] , sib[N];
int sz[N];
vector<int>G[N];
int L[N], R[N];
void dfs(int u,int p,int lv = 0)
{
      Time[u] =++ dfn;
      dep[u]= lv;
      sz[u]=1;
      L[u] = dfn+1;
      for(auto a: G[u]) if(a!=p){
            P[a][0] = u;
            dfs(a,u,lv+1);
            sz[u] += sz[a];
            sub[u].pb(dfn);
            sib[u].pb(sz[a]);
      }
      R[u] = dfn;
}

int lca(int u,int v)
{
      if(dep[u] < dep[v]) swap(u,v);
      int d = dep[u] - dep[v];
      for(int i=LG-1;i >=0 ; i--) if(d&(1<<i)) u= P[u][i];
      if(u==v) return u;
      
      for(int i = LG-1; i>=0; i--) {
            if(P[u][i] != P[v][i]) {
                  u = P[u][i], v=P[v][i];
            }
      }
      return P[u][0];
      
}

int dist(int u,int v)
{
      int l = lca(u,v);
      return dep[u] + dep[v] - 2 * dep[l];
      
}
int pth(int u,int p)
{
      //db(p);
      for(int i = LG-1; i>=0;i--) if(p&(1<<i)) u = P[u][i] , p-= (1<<i);
      return u;
}

int main()
{
      Di(n);
      forn(i,n-1) {
            Dii(a,b);
            G[a].pb(b);
            G[b].pb(a);
            
      }
      ms(P,-1);
      dfs(1,-1);
      for(int i=1;i<LG;i++){
            for(int j=1;j<=n ;j++ ) {
                  if(P[j][i-1] !=-1 ) P[j][i] = P[P[j][i-1]][i-1];
            }
      }
      
      Di(q);
      while(q--)
      {
            Dii(a,b);
            int o = dist(a,b);
            int pivot;
            if(o % 2==0 ) {
                  if(dep[a] > dep[b]) pivot= pth(a,o/2);
                  else pivot = pth(b,o/2);
                  int loo = lca(a,b);
                  
                  if(pivot == loo) {
                        int d = n;
                        if(Time[a] >= L[pivot] && Time[a] <= R[pivot]) {
                              int p1 = lower_bound(all(sub[pivot]),Time[a]) - sub[pivot].begin();
                              d -= sib[pivot][p1];
                        }
                        if(Time[b]>= L[pivot] && Time[b] <= R[pivot]) {
                              int p1 = lower_bound(all(sub[pivot]),Time[b]) - sub[pivot].begin();
                              d -= sib[pivot][p1];
                        }
                        printf("%d\n",d);
                  }
                  else {
                        int d = sz[pivot];
                        if(Time[a] >= L[pivot] && Time[a] <= R[pivot]) {
                              int p1 = lower_bound(all(sub[pivot]),Time[a]) - sub[pivot].begin();
                              d -= sib[pivot][p1];
                        }
                        if(Time[b]>= L[pivot] && Time[b] <= R[pivot]) {
                              int p1 = lower_bound(all(sub[pivot]),Time[b]) - sub[pivot].begin();
                              d -= sib[pivot][p1];
                        }
                        printf("%d\n",d);
                  }
                  
            }else printf("0\n");
            
      }
      
      
      
      return 0;
}

CF – 594D – REQ

Discussion:
The problem is a good data structure problem on offline query.
Using formula: phi(n) = n * (1 – 1/ p1) * ( 1 – 1/p2 ) ……

/*
 
 *************************
 Id  : Matrix.code
 Task: CF 594D
 Date:
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
Long bigmod(Long p,Long e,Long M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return ret;}
Long gcd(Long a,Long b){if(b==0)return a;return gcd(b,a%b);}
Long modinverse(Long a,Long M){return bigmod(a,M-2,M);}
void io(){freopen("/Users/MyMac/Desktop/in.txt","r",stdin);}

/*************************** END OF TEMPLATE ****************************/
const int N = 2e5+5;
const int MX= 1e6+6;
Long MOD = 1e9+7;
Long a[N];
vector<ii> G[N];
vector<int> Prime;
vector<int> L[MX];
bool vis[MX];


void seive()
{
      
      for(int i=2;i < MX ; i ++ ) {
            if(vis[i] ==0 ) {
                  L[i].pb(i);
                  Prime.pb(i);
                  for(int j = 2 ; i * j < MX ; j ++ ){
                        L[i*j].pb(i);
                        vis[i*j] = 1;
                  }
            }
      }
}

int pos[MX];
vector<ii> nxt[N];
Long ib[N];

void update(int x,Long val)
{
      while(x<N) {
            ib[x] *= val;
            ib[x] %= MOD;
            x += x&-x;
      }
}

Long ans[N];

Long query(int x)
{
      Long r  = 1;
      for( ; x > 0; x -= x&-x){
            r *= ib[x];
            r %= MOD;
      }
      return r;
}
int main()
{
      
      seive();
      Di(n);
      for(int i = 1;i <= n; i ++){
            Si(a[i]);
      }
      forn(i,MX) pos[i] = n+1;
      for(int i = n ; i>  0; i -- ) {
            for(auto k: L[a[i]]) {
                  nxt[i].pb(mp(k,pos[k]));
                  pos[k] = i;
            }
      }
      forn(i,n+1) ib[i] = 1;
      for(int i = 1;i <= n;i ++ ) update(i , a[i]);
      for(auto a: Prime ) {
            int posi = pos[a];
            if(posi <= n ) {
                  Long u = ((a-1) * modinverse(a,MOD)) % MOD;
                  update(posi,u);
            }
      }
      
      Di(q);
      
      forn(i,q){
            Dii(a,b);
            G[a].pb(mp(b,i));
      }
      for(int i = 1; i<= n; i ++ ) {
            for(auto a: G[i]) {
                  int R = a.Fr, ind = a.Sc;
                  ans[ind] = query(R);
            }
            update(i, modinverse(a[i] , MOD));
            for(int u = 0; u < L[a[i]].Sz; u ++ ) {
                  Long pp = L[a[i]][u];
                  Long up = (pp * modinverse(pp-1, MOD)) %MOD;
                  update(i,up);
                  int neid = nxt[i][u].Sc;
                  if(neid <= n ) {
                        up = ((pp-1) * modinverse(pp,MOD)) %MOD;
                        update(neid, up);
                  }
            }
      }
      forn(i,q) printf("%lld\n" , ans[i]);
      return 0;
}

Permutations in CF

Link : 233A

This is known as square permutations. Mostly cycle finding and greedy algorithms work for them.

/*
 
 *************************
 Id  : Matrix.code
 Task:
 Date:
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
template <class T> inline T bigmod(T p,T e,T M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return (T)ret;}
template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
template <class T> inline T modinverse(T a,T M){return bigmod(a,M-2,M);}
void io(){freopen("in.txt","r",stdin); freopen("out.txt","w",stdout);}

/*************************** END OF TEMPLATE ****************************/
const int N = 1001;

int main()
{
      Di(n);
      if(n%2==0) {
            for(int i=1;i<=n;i+=2) {
                  printf("%d %d ", i+1,i);
            }
      }
      else printf("-1");
      return 0;
}

Second Problem : 482A
Code templates are given above. only the main code part


const int N = 1e5+5;
set<int> S,pq;
int A[N];
bool vis[N];
vi pp;
int main()
{
      Dii(n,k);
      int bb = n;
      forn(i,k) S.insert(i+1);
      A[0] = n;
      vis[n] = 1;
      int foo = -1;
      int i ;
      for( i= 1; i< n && S.Sz ; i ++ ) {
            int oo = *S.rbegin();
            int p = A[i-1] + foo * oo;
            A[i] = p;
            vis[p] = 1;
            S.erase(*S.rbegin());
            foo *= -1;
            
      }
      set<int>SS;
      forn(oo,n) if(vis[oo+1] == 0 ) {
            SS.insert(oo+1);
      }
      
      int kolp = 0;
      for(; i < n; i ++ ) {
            auto d = SS.lower_bound(A[i-1] - k);
            int oo = *d;
            SS.erase(oo);
            A[i] = oo;
      }
      forn(i,n) printf("%d ", A[i]);
      return 0;
}



Third Problem : 287C


const int N = 2e5+5;
int P[N];
int n;

void Trv(int b,int e)
{
      if(b==e) {
            P[b]=e;
            return ;
      }
      if(b>e) return;
      P[b] = b+1;
      P[b+1] = e;
      P[e-1] = b;
      P[e] = e-1;
      Trv(b+2,e-2);
}
int main()
{
      Si(n);
      
      if(n%4<2) {
            Trv(1,n);
            forn(i,n) printf("%d " , P[i+1]);
      }else puts("-1");
      return 0;
}


Brute Force

List of Problems that I solved using brute force but they seem of other type.
Problem 1: CF- 236C

/*
 
 *************************
 Id  : Matrix.code
 Task:
 Date:
 
 **************************
 
 */

#include <bits/stdc++.h>
using namespace std;

/*------- Constants---- */

#define Long                    long long
#define ull                     unsigned long long
#define mod                     1000000007
#define MEMSET_INF              63
#define MEM_VAL                 1061109567
#define forn(i,n)               for( int i=0 ; i < n ; i++ )
#define mp(i,j)                 make_pair(i,j)
#define lop(i,a,b)              for( int i = (a) ; i < (b) ; i++)
#define pb(a)                   push_back((a))
#define all(x)                  (x).begin(),(x).end()
#define gc                      getchar_unlocked
#define PI                      acos(-1.0)
#define INF                     1<<29
#define EPS                     1e-9
#define Fr                      first
#define Sc                      second
#define Sz                      size()
#define lc                      ((n)<<1)
#define rc                      ((n)<<1|1)
#define db(x)                   cout << #x << " -> " << x << endl;
#define Di(n)                   int n;si(n)
#define Dii(a,b)                int a,b;si(a);si(b)
#define Diii(a,b,c)             int a,b,c;si(a);si(b);si(c)
#define Si(n)                   si(n)
#define Sii(a,b)                si(a);si(b)
#define Siii(a,b,c)             si(a);si(b);si(c)
#define min(a,b)                ((a)>(b) ? (b) : (a) )
#define max(a,b)                ((a)>(b) ? (a):(b))
/*---- short Cuts ------- */
#define ms(ara_name,value) memset(ara_name,value,sizeof(ara_name))
typedef pair<int, int> ii;
typedef vector<int > vi ;
typedef vector<Long> vl;
/*------ template functions ------ */
#ifndef getchar_unlocked
#define getchar_unlocked getchar
#endif
template<class T> inline void si(T &x){register int c = gc();x = 0;int neg = 0;for(;((c<48 | c>57) && c != '-');c = gc());
      if(c=='-') {neg=1;c=gc();}for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}if(neg) x=-x;}
template <class T> inline T bigmod(T p,T e,T M){Long ret = 1;for(; e > 0; e >>= 1){if(e & 1) ret = (ret * p) % M;p = (p * p) % M;} return (T)ret;}
template <class T> inline T gcd(T a,T b){if(b==0)return a;return gcd(b,a%b);}
template <class T> inline T modinverse(T a,T M){return bigmod(a,M-2,M);}
void io(){freopen("in.txt","r",stdin); freopen("out.txt","w",stdout);}

/*************************** END OF TEMPLATE ****************************/
Long n;
int main()
{
      Si(n);
      Long iM = 0;
      for(Long i = n; i > max(n-100,0) ; i-- ) {
            for(Long j = i; j > max(n-100,0) ; j--) {
                  for(Long k = i; k > max(n-100,0) ; k-- ) {
                        Long p = i * j / gcd(i,j);
                        p = p * k / gcd(p,k);
                        iM = max(iM, p);
                  }
            }
      }
      printf("%lld\n",iM);
      return 0;
}