Pagini recente » Cod sursa (job #2015575) | Infoarena Monthly 2014 - Runda 2 | Clasament havesomefun_final | Cod sursa (job #866340) | Cod sursa (job #532964)
Cod sursa(job #532964)
// http://infoarena.ro/problema/hotel
#include <fstream>
#include <cmath>
using namespace std;
#define maxSize 100002
#define leftSon 2*node
#define rightSon 2*node+1
#define begin first
#define end second
ifstream in("hotel.in");
ofstream out("hotel.out");
int value;
int currentLenght,maxLenght;
pair<int,int> interval;
int tree[262144];
void update(int node,int left,int right);
void findSubsequence(int node,int left,int right);
int main() {
int rooms,instructions,type;
in >> rooms >> instructions;
for(int i=1;i<=instructions;i++) {
in >> type;
switch(type) {
case 1:
in >> interval.begin >> interval.end;
interval.end = interval.begin + interval.end - 1;
update(1,1,rooms);
break;
case 2:
in >> interval.begin >> interval.end;
interval.end = interval.begin + interval.end - 1;
update(1,1,rooms);
break;
case 3:
findSubsequence(1,1,rooms);
out << maxLenght << "\n";
currentLenght = 0;
maxLenght = 0;
break;
}
}
return (0);
}
void update(int node,int left,int right) {
if(left == right) {
tree[node] = !tree[node];
return;
}
else {
int middle = (left + right) / 2;
if(interval.begin <= middle)
update(leftSon,left,middle);
if(interval.end > middle)
update(rightSon,middle+1,right);
}
//tree[node] = max(tree[leftSon],tree[rightSon]);
}
void findSubsequence(int node,int left,int right) {
if(left == right) // daca este un interval elementar
if(!tree[node]) {
currentLenght++;
maxLenght = max(maxLenght,currentLenght);
}
else
currentLenght = 0;
else {
int middle = (left + right) / 2;
findSubsequence(leftSon,left,middle);
findSubsequence(rightSon,middle+1,right);
}
}