Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define Nmax 1005
- using namespace std;
- class InParser {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch() {
- ++sp;
- if (sp == 4096) {
- sp = 0;
- fread(buff, 1, 4096, fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume) {
- fin = fopen(nume, "r");
- buff = new char[4096]();
- sp = 4095;
- }
- InParser& operator >> (int &n) {
- char c;
- while (!isdigit(c = read_ch()) && c != '-');
- int sgn = 1;
- if (c == '-') {
- n = 0;
- sgn = -1;
- } else {
- n = c - '0';
- }
- while (isdigit(c = read_ch())) {
- n = 10 * n + c - '0';
- }
- n *= sgn;
- return *this;
- }
- InParser& operator >> (long long &n) {
- char c;
- n = 0;
- while (!isdigit(c = read_ch()) && c != '-');
- long long sgn = 1;
- if (c == '-') {
- n = 0;
- sgn = -1;
- } else {
- n = c - '0';
- }
- while (isdigit(c = read_ch())) {
- n = 10 * n + c - '0';
- }
- n *= sgn;
- return *this;
- }
- };
- class OutParser {
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch) {
- if (sp == 50000) {
- fwrite(buff, 1, 50000, fout);
- sp = 0;
- buff[sp++] = ch;
- } else {
- buff[sp++] = ch;
- }
- }
- public:
- OutParser(const char* name) {
- fout = fopen(name, "w");
- buff = new char[50000]();
- sp = 0;
- }
- ~OutParser() {
- fwrite(buff, 1, sp, fout);
- fclose(fout);
- }
- OutParser& operator << (int vu32) {
- if (vu32 <= 9) {
- write_ch(vu32 + '0');
- } else {
- (*this) << (vu32 / 10);
- write_ch(vu32 % 10 + '0');
- }
- return *this;
- }
- OutParser& operator << (long long vu64) {
- if (vu64 <= 9) {
- write_ch(vu64 + '0');
- } else {
- (*this) << (vu64 / 10);
- write_ch(vu64 % 10 + '0');
- }
- return *this;
- }
- OutParser& operator << (char ch) {
- write_ch(ch);
- return *this;
- }
- OutParser& operator << (const char *ch) {
- while (*ch) {
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- InParser fin("episodul3.in");
- OutParser fout("episodul3.out");
- int N, M;
- int dx[] = {1, -1, 0, 0};
- int dy[] = {0, 0, 1, -1};
- int getNode[Nmax][Nmax];
- int T[22][Nmax * Nmax];
- int nodes;
- int dist[Nmax * Nmax];
- int getKthAncestor(int K, int node)
- {
- for(int i = 10; i >= 0; i--)
- if(K & (1 << i))
- {
- node = T[i][node];
- K -= (1 << i);
- }
- return node;
- }
- int getLCA(int node1, int node2)
- {
- if(node1 == node2)
- return node1;
- int pos = dist[node1] + 1;
- int i;
- for(i = 0; (1 << i) <= dist[node1]; i++);
- for(; i >= 0; i--)
- if(T[i][node1] != T[i][node2])
- {
- node1 = T[i][node1];
- node2 = T[i][node2];
- pos -= (1 << i);
- }
- return T[0][node1];
- }
- int main()
- {
- fin >> N >> M;
- while(M--)
- {
- int t;
- fin >> t;
- if(t == 1)
- {
- int i, j;
- fin >> i >> j;
- getNode[i][j] = ++nodes;
- for(int d = 0; d < 4; d++)
- if(getNode[i + dx[d]][j + dy[d]] != 0)
- T[0][nodes] = getNode[i + dx[d]][j + dy[d]], dist[nodes] = 1 + dist[getNode[i + dx[d]][j + dy[d]]];
- if(dist[nodes] == 0)
- dist[nodes] = 1;
- for(int i = 1; (1 << i) <= dist[nodes]; i++)
- T[i][nodes] = T[i - 1][T[i - 1][nodes]];
- }
- if(t == 2)
- {
- int i, j, i2, j2;
- fin >> i >> j >> i2 >> j2;
- int node1 = getNode[i][j];
- int node2 = getNode[i2][j2];
- if(dist[node1] > dist[node2])
- swap(node1, node2);
- int sameLevel = getKthAncestor(dist[node2] - dist[node1], node2);
- int LCA = getLCA(node1, sameLevel);
- fout << dist[node1] + dist[node2] - 2 * dist[LCA] + 1 << "\n";
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment