Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int transform (int x, int y, int m)
- {
- return (x-1)*m + y-1;
- }
- int dp[1000001][21];
- bitset <1000001> fv;
- int nivel[1000001];
- int cate2;
- void adauga (int x, int y, int n, int m)
- {
- int current = transform(x, y, m);
- int stanga = transform (x, y-1, m), dreapta = transform(x, y+1, m), sus = transform(x-1, y, m), jos = transform(x+1, y, m);
- if (x == n) jos = -1;
- if (y == m) dreapta = -1;
- if (x == 1) sus = -1;
- if (y == 1) stanga = -1;
- if (stanga >= 0 && fv[stanga])
- {
- fv[current] = 1;
- nivel[current] = nivel[stanga]+1;
- dp[current][0] = stanga;
- for (int i = 1; i<=20; ++i)
- dp[current][i] = dp[dp[current][i-1]][i-1];
- return ;
- }
- if (dreapta >= 0 && fv[dreapta])
- {
- fv[current] = 1;
- nivel[current] = nivel[dreapta]+1;
- dp[current][0] = dreapta;
- for (int i = 1; i<=20; ++i)
- dp[current][i] = dp[dp[current][i-1]][i-1];
- return ;
- }
- if (jos >= 0 && fv[jos])
- {
- fv[current] = 1;
- nivel[current] = nivel[jos]+1;
- dp[current][0] = jos;
- for (int i = 1; i<=20; ++i)
- dp[current][i] = dp[dp[current][i-1]][i-1];
- return ;
- }
- if (sus >= 0 && fv[sus])
- {
- fv[current] = 1;
- nivel[current] = nivel[sus]+1;
- dp[current][0] = sus;
- for (int i = 1; i<=20; ++i)
- dp[current][i] = dp[dp[current][i-1]][i-1];
- return ;
- }
- fv[current] = 1;
- nivel[current] = 1;
- }
- 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;
- }
- };
- int distanta (int x1, int y1, int x2, int y2, int n, int m)
- {
- int nod1 = transform(x1, y1, m), nod2 = transform(x2, y2, m);
- if (nod1 == nod2) return 1;
- if (nivel[nod1] > nivel[nod2]) swap(nod1, nod2);
- int copie1 = nod1, copie2 = nod2;
- int diferenta = nivel[nod2] - nivel[nod1];
- for (int i = 20; i>=0; --i)
- if (diferenta >= (1<<i))
- {
- nod2 = dp[nod2][i];
- diferenta -= (1<<i);
- }
- if (nod1 == nod2) return nivel[copie1] + nivel[copie2] - 2*nivel[nod1] + 1;
- for (int i = 20; i>=0; --i)
- if (dp[nod1][i] != dp[nod2][i])
- {
- nod1 = dp[nod1][i];
- nod2 = dp[nod2][i];
- }
- nod1 = dp[nod1][0];
- nod2 = dp[nod2][0];
- return nivel[copie1] + nivel[copie2] - 2*nivel[nod1] + 1;
- }
- int main(int argc, char const *argv[])
- {
- InParser fin ("episodul3.in");
- OutParser fout ("episodul3.out");
- int n, m;
- fin >> n >> m;
- for (int i = 1; i<=m; ++i)
- {
- int tip;
- fin >> tip;
- if (tip == 1)
- {
- int x, y;
- fin >> x >> y;
- adauga(x, y, n, n);
- }
- else
- {
- int x1, y1, x2, y2;
- fin >> x1 >> y1 >> x2 >> y2;
- fout << distanta(x1, y1, x2, y2, n, n) << '\n';
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment