Cod sursa(job #1166993)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 4 aprilie 2014 09:39:13
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<algorithm>
using namespace std;
int n, m, maxim, p, u, mid, x, y, i, k, z, j, poz1, poz2;
int a[65][100001];
pair<int , int> v[100001];
ifstream fin("marbles.in");
ofstream fout("marbles.out");
int main(){
	fin>> n >> m;
	for(i = 1; i <= n; i++){
		fin>> v[i].first >> v[i].second;
		for(j = 1; j <= 64; j++){
			if(j == v[i].second){
				a[j][i] = a[j][i-1] + 1;
			}
			else{
				a[j][i] = a[j][i-1];
			}
		}
	}
	sort(v + 1, v + n + 1);
	for(k = 1; k <= m; k++){
		fin>> x >> y >> z;
		if(x == 0){
			p = 1;
			u = n;
			while(p <= u){
				mid = (p + u) / 2;
				if(v[mid].first == y){
					break;
				}
				else{
					if(v[mid].first > y){
						u = mid - 1;
					}
					else{
						p = mid + 1;
					}
			     }
			}
			v[mid].first += z;
		}
		else{
			if(v[1].first > y){
				poz1 = 1;
			}
			else{
				p = 1;
				u = n;
				while(p <= u){
					mid = (p + u) / 2;
					if(v[mid].first >= y){
						if(v[mid - 1].first < y){
							poz1 = mid;
							break;
						}
						else{
							u = mid - 1;
						}
					}
					else{
						p = mid + 1;
					}
				}
			}
			p = 1;
			u = n;
			if(v[n].first < z){
				poz2 = n;
			}
			else {
				while(p <= u){
					mid = (p + u) / 2;
					if(v[mid].first <= z){
						if(v[mid + 1].first > z){
							poz2 = mid;
							break;
						}
						else{
							u = mid - 1;
						}
					}
					else{
						p = mid + 1;
					}
				}
			}
			maxim = 0;
			for(i = 1; i <= 64; i++){
				if(a[i][poz2] - a[i][poz1-1] > maxim){
					maxim = a[i][poz2] - a[i][poz1-1]; 
				}
			}
			fout<< maxim <<"\n";
		}
	}
	return 0;
}