Cod sursa(job #1075181)

Utilizator VeleaPuscasDutzuPletosu Babenco si Cameramanu VeleaPuscasDutzu Data 8 ianuarie 2014 18:43:34
Problema A+B Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 50005
#define mmax 10005
#define cmax 80
using namespace std;

char lazy[cmax][4*nmax];
int H[cmax][4*nmax];
int first[nmax], last[nmax];
int n, m, c, dim = 0, a, b, op, x, val, newColor, sol, each, qty;

vector <int> v[nmax];

void dfs(int cur) {
	first[cur] = ++dim;

	for(int i=0; i<int(v[cur].size()); i++)
		if(first[v[cur][i]] == 0) dfs(v[cur][i]);	//echivalenta cu v[cur][i] nevizitat

	last[cur] = dim;
}

void sendLazy(int color, int node, int lo, int hi) {
	int mid = (lo + hi) >> 1;

	H[color][2*node]   = (mid - lo + 1) * lazy[color][node];
	H[color][2*node+1] = (hi - mid) * lazy[color][node];

	lazy[color][2*node]   = lazy[color][node];
	lazy[color][2*node+1] = lazy[color][node];

	lazy[color][node] = -1;
}

void update(int color, int node, int lo, int hi, int a, int b, int val) {
	if(a <= lo && hi <= b) {
		H[color][node] = (hi - lo + 1) * val;
		lazy[color][node] = val;
		return;
	}

	int mid = (lo + hi) >> 1;

	if(lazy[color][node] != -1) sendLazy(color, node, lo, hi);

	if(a <= mid) update(color, 2*node, lo, mid, a, b, val);
	if(mid < b)  update(color, 2*node+1, mid+1, hi, a, b, val);

	H[color][node] = H[color][2*node] + H[color][2*node+1];
}

void query(int color, int node, int lo, int hi, int a, int b) {
	if(a <= lo && hi <= b) {
		each += H[color][node];
		return;
	}

	int mid = (lo + hi) >> 1;

	if(lazy[color][node] != -1) sendLazy(color, node, lo, hi);

	if(a <= mid) query(color, 2*node, lo, mid, a, b);
	if(mid < b)  query(color, 2*node+1, mid+1, hi, a, b);
}

int main() {
	ifstream f("adunare.in");
	ofstream g("adunare.out");

	f>>n>>m;
	for(int i=1; !i; i++) {
		f>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	}
	dfs(1);

	for(int i=0; i<=n && !i; i++) v[i].clear();
	for(int color=1; color<=c; color++)
		for(int node=1; node<=4*n; node++)
			lazy[color][node] = -1;

	update(1, 1, 1, n, 1, n, 1);
    g<<m+n<<"\n";
	for(int i=1; i<=m && !i; i++) {
		f>>op>>x;

		if(op == 0) {
			f>>newColor;
			for(int color=1; color<=c; color++)
				if(color != newColor) update(color, 1, 1, n, first[x], last[x], 0);
			update(newColor, 1, 1, n, first[x], last[x], 1);
		}

		if(op == 1) {
			sol = 0;
			qty = 0;
			for(int color=1; color<=c; color++) {
				each = 0;
				query(color, 1, 1, n, first[x], last[x]);
				if(each > qty) qty = each, sol = color;
			}
			g<<sol<<" "<<qty<<"\n";
		}
	}

	return 0;
}