rt,WA on 39
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ret=0,f=1;
char c=getchar();
while(c<'0'||'9'<c){
if(c=='-') f=-1;
c=getchar();
}
while('0'<=c&&c<='9'){
ret=(ret<<1)+(ret<<3)+(int)(c-'0');
c=getchar();
}
return ret*f;
}
inline long long readll(){
long long ret=0ll,f=1ll;
char c=getchar();
while(c<'0'||'9'<c){
if(c=='-') f=-1ll;
c=getchar();
}
while('0'<=c&&c<='9'){
ret=(ret<<1ll)+(ret<<3ll)+(long long)(c-'0');
c=getchar();
}
return ret*f;
}
inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>=10) write(x/10);
putchar('0'+x%10);
}
inline void writell(long long x){
if(x<0ll){
putchar('-');
x=-x;
}
if(x>=10ll) writell(x/10ll);
putchar('0'+x%10ll);
}
typedef long long LL;
const int NR=5e5+5,KR=55;
int n;
int u[NR],v[NR],a[NR],c[NR],now[NR];//a[i]表示第i个询问涉及的边的编号,c[i]表示第i个询问所代表的颜色,now[i]表示边i当前的颜色
vector<int>q[NR<<2];
int fa[NR<<1][KR],sz[NR<<1][KR];
inline int find(int x,int col){
while(fa[x][col]!=x) x=fa[x][col];
return x;
}
int statop=0;
struct Node{
int u,v,col;
}sta[NR];
inline void merge(int x,int y,int col){
int rx=find(x,col),ry=find(y,col);
if(rx==ry) return;
if(sz[rx][col]>sz[ry][col]) swap(rx,ry);
fa[rx][col]=ry;
sz[ry][col]+=sz[rx][col];
sta[++statop]=Node{rx,ry,col};
}
inline void cancel(){
int rx=sta[statop].u,ry=sta[statop].v,col=sta[statop].col;
fa[rx][col]=rx;
sz[ry][col]-=sz[rx][col];
statop--;
}
inline void update(int p,int l,int r,int ql,int qr,int k){//k为询问编号
if(ql>qr) return;
if(ql<=l&&r<=qr){
q[p].push_back(k);
return;
}
int mid=(l+r)>>1;
if(ql<=mid) update(p<<1,l,mid,ql,qr,k);
if(qr>mid) update(p<<1|1,mid+1,r,ql,qr,k);
}
inline void dfs(int p,int l,int r){
int tmp=statop;
for(unsigned int i=0;i<q[p].size();i++){
int pos=q[p][i];
int col=c[pos];
if(col!=0){
merge(v[a[pos]]+n,u[a[pos]],col);
merge(u[a[pos]]+n,v[a[pos]],col);
}
}
if(l==r){
int pos=a[l],col=c[l];
if(find(u[pos],col)!=find(v[pos],col)&&find(u[pos]+n,col)!=find(v[pos]+n,col)){
printf("YES\n");
now[pos]=col;
}else{
printf("NO\n");
c[l]=now[pos];
}
}else{
int mid=(l+r)>>1;
dfs(p<<1,l,mid);
dfs(p<<1|1,mid+1,r);
}
while(tmp<statop) cancel();
}
vector<int>g[NR];
int main(){
// ios::sync_with_stdio(false);
int m,k,t;
n=read();m=read();k=read();t=read();
for(int i=1;i<=n*2;i++){
for(int j=1;j<=k;j++){
fa[i][j]=i;
sz[i][j]=1;
}
}
for(int i=1;i<=m;i++){
u[i]=read();v[i]=read();
}
for(int i=1;i<=t;i++){
a[i]=read();c[i]=read();
g[a[i]].push_back(i);
}
for(int i=1;i<=m;i++){
if(g[i].size()==0) continue;
int last=0;
for(unsigned int j=0;j<g[i].size();j++){
int ix=g[i][j];
if(last!=0) update(1,1,t,last+1,ix-1,last);
last=ix;
}
update(1,1,t,last+1,t,last);
}
dfs(1,1,t);
return 0;
}