Submission #1176593

#TimeUsernameProblemLanguageResultExecution timeMemory
1176593sanoPairs (IOI07_pairs)C++20
30 / 100
254 ms138908 KiB
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#include <cassert>

#define shit short int
#define ll long long
//#define int ll
#define For(i, n) for(int i = 0; i < (int)n; i++)
#define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++)
#define rfor(i, n) for(int i = (int)n; i >= (int)0; i--)
#define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<int, int>
#define NEK 2000000000
#define mod 1000000007
#define mod2 1000000009
#define rsz resize 
#define prv1 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define all(x) (x).begin(), (x).end()
#define sig 0.0000001

using namespace std;

class intervalac {
	int n;
	struct node {
		int in = 0;
		int lp = 0;
		node* left = nullptr;
		node* right = nullptr;
	};
	node* root = new node;

	void apply(node* s, int l, int r, int x) {
		s->in += (r - l + 1) * x;
		s->lp += x;
		return;
	}

	void propagate(node* s, int l, int r) {
		if (s->left == nullptr) s->left = new node;
		if (s->right == nullptr) s->right = new node;
		int m = (l + r) / 2;
		apply(s->left, l, m, s->lp);
		apply(s->right, m + 1, r, s->lp);
		s->lp = 0;
	}

	void zmen(node* s, int l, int r, int a, int b, int k) {
		if (l > b || r < a) return;
		if (a <= l && r <= b) {
			s->in += k * (r - l + 1);
			s->lp += k;
			return;
		}
		propagate(s, l, r);
		int m = (l + r) / 2;
		zmen(s->left, l, m, a, b, k), zmen(s->right, m + 1, r, a, b, k);
		s->in = s->left->in + s->right->in;
		return;
	}

	int daj(node* s, int l, int r, int a, int b) {
		if (l > b || r < a) return 0;
		if (a <= l && r <= b) return s->in;
		propagate(s, l, r);
		int m = (l + r) / 2;
		return daj(s->left, l, m, a, b) + daj(s->right, m + 1, r, a, b);
	}

public:
	intervalac(int vel) {
		n = vel;
		return;
	}
	void zmen(int a, int b, int k) {
		zmen(root, 0, n - 1, a, b, k);
		return;
	}
	int daj(int a, int b) {
		return daj(root, 0, n - 1, a, b);
	}
};

signed main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int tt; cin >> tt;
	if (tt == 1) {
		int n, d, m; cin >> n >> d >> m;
		vec<int> p(n);
		For(i, n) cin >> p[i];
		intervalac seg(m+1);
		ll vys = 0;
		For(i, n) {
			seg.zmen(p[i], p[i], 1);
			vys += (seg.daj(p[i] - d, p[i] + d) - 1);
		}
		cout << vys << '\n';
		return 0;
	}
	if(tt == 2){
		
	}
	if (tt == 3) {

	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...