Pagini recente » Statistici Berindei Vlad (smecheru) | Profil NightRaven | Istoria paginii utilizator/draganoid345 | Diferente pentru problema-majoritatii-votului intre reviziile 22 si 32 | Cod sursa (job #2522182)
#include <fstream>
#include <algorithm>
using namespace std;
pair <int,int> a[100010];
int b[64][100010];
int i,j,n,m,p,c,cMax,q,p1,p2,poz,val,x,st,dr,mid;
int cautBin (int x) {
int st=1,dr=n;
while (st<=dr) {
int mid=(st+dr)/2;
if (a[mid].first==x) return mid;
if (a[mid].first>=x) dr=mid-1;
else st=mid+1;
}
}
void creareMatrice () {
for (i=1;i<=cMax;i++) {
for (j=1;j<=n;j++) {
if (a[j].second==i) {
b[i][j]=b[i][j-1]+1;
}
else b[i][j]=b[i][j-1];
}
}
}
int main() {
ifstream fin("marbles.in");
ofstream fout("marbles.out");
fin>>n>>m;
for (i=1;i<=n;i++) {
fin>>p>>c;
a[i]=make_pair(p,c); ///a[i].first=pozitie
cMax=max(cMax,c); ///a[i].second=culoare
}
sort(a+1,a+n+1);
creareMatrice();
for (x=1;x<=m;x++) {
fin>>q>>p1>>p2;
if (q==0) {
poz=cautBin(p1);
a[poz].first+=p2;
}
else {
st=1;
dr=n;
while (st<=dr) { ///caut cea mai mica pozitie cu valoare mai mare sau egala decat p1
mid=(st+dr)/2;
if (a[mid].first>=p1) dr=mid-1;
else st=mid+1;
}
p1=st;
st=1;
dr=n;
while (st<=dr) { ///caut cea mai mare pozitie cu valoare mai mica sau egala decat p2
mid=(st+dr)/2;
if (a[mid].first<=p2) st=mid+1;
else dr=mid-1;
}
p2=dr;
val=0;
for (i=1;i<=cMax;i++) {
val=max(val,b[i][p2]-b[i][p1-1]);
}
fout<<val<<"\n";
}
}
return 0;
}